เป็นไปได้หรือไม่ที่จะแก้ไขไฟล์ yml ผ่าน shell script?


12

นี่คือลักษณะที่นักเทียบท่าของฉัน-compose.yml ดูเหมือน

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
  links:
    - 'anything'

ตอนนี้ฉันต้องเพิ่มเนื้อหาผ่านเชลล์สคริปต์ (บนเซิร์ฟเวอร์ ubuntu) ฉันไม่แน่ใจว่ามันจะเป็นไปได้ทั้งหมด:

  1. เพิ่มองค์ประกอบใหม่ให้กับnginx/linksหากไม่มีอยู่
  2. ผนวกnewthingบล็อกถ้าไม่มีสิ่งบล็อกใหม่อยู่

เนื้อหาใหม่ควรมีลักษณะเช่นนี้:

nginx:
  container_name: 'nginx'
  image: 'nginx:1.11'
  restart: 'always'
  ports:
    - '80:80'
    - '443:443'
  volumes:
    - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro'
    - '/etc/letsencrypt:/etc/letsencrypt'
  links:
    - 'anything'
    - 'newthing'

newthing:
  container_name: foo
  image: 'newthing:1.2.3'
  restart: always
  hostname: 'example.com'

1
เชลล์มอบภาษาสคริปต์ที่ทรงพลังแก่คุณ คุณสามารถเขียนสคริปต์โดยใช้sed, awkและregular expressionsอัปเดตไฟล์ของคุณ
ฟอสซิล

คุณช่วยยกตัวอย่างเล็กน้อยได้ไหม
user3142695

2
แม้ว่าจะเป็นไปได้ในทางเทคนิคในการใช้เชลล์คุณจะต้องใช้ภาษาที่มีไลบรารี่ yaml จริง
จอร์แดน

ฉันแนะนำให้คุณไปที่ruamel.yamlไลบรารี่สำหรับ Python
phk

ฉันคิดว่ามันคุ้มค่าที่จะทราบว่าการเชื่อมโยงเป็นคุณสมบัติแบบดั้งเดิมซึ่งจะถูกลบออกจากนักเทียบท่าในอนาคต: docs.docker.com/compose/compose-file/#links
Mikael Kjær

คำตอบ:


6

มีไลบรารี่ yaml จำนวนมากสำหรับ Perl, Python และอื่น ๆ ถ้ามันโอเคที่จะทำไม่ได้โดยตรงจากเชลล์สคริปต์ แต่ใช้ภาษาอื่น

อีกทางเลือกหนึ่งคือการติดตั้งโปรเซสเซอร์ yamlบรรทัดคำสั่งและเรียกมันจากเชลล์สคริปต์ของคุณ


8

ฉันเขียนhttps://github.com/kislyuk/yqเสื้อคลุมรอบ ๆhttps://stedolan.github.io/jq/เพื่อระบุกรณีการใช้งานนี้


สามารถอัพเดทได้ไหม
weynhamz

1
yq -y '.newthing=...' input.yml > output.ymlใช่: (หากคุณกำลังถามเกี่ยวกับการอัปเดตในสถานที่เช่นsed -iyq ยังไม่สามารถทำได้ด้วยตัวเอง แต่คุณสามารถใช้sponge: yq -y .newthing=... file.yml | sponge file.yml.)
ผู้ประกอบ

1
@ weaver คุณเป็นฮีโร่คนใหม่ของฉัน
voutasaurus

7

ฉันเขียน yaml_cli ( https://github.com/Gallore/yaml_cli ) เพื่อทำสิ่งที่คุณต้องการ มันขึ้นอยู่กับหลาม นี่จะเป็นไวยากรณ์สำหรับตัวอย่างของคุณ:

yaml_cli \
  -f docker-compose.yml \                # read from and save to file
  --list-append \                        # flag to append to lists instead of replacing existing values
  -s nginx:links newthing \              # add a value of type string; here you need --list-append
  -s newthing:container_name foo \       # key 'newthing' is created automatically
  -s newthing:image 'newthing:1.2.3' \   #
  -s newthing:restart always \           #
  -s newthing:hostname 'example.com'     #

ความคิดเห็นเกี่ยวกับ yaml_cli ได้รับการชื่นชม


1

เนื่องจากเหตุผลที่คุณต้องการทำเช่นนี้คือการแก้ไขไฟล์นักเทียบท่าประกอบอีกทางเลือกหนึ่งคือการใช้ไฟล์ JSON ตอนนี้ตัวเชื่อมต่อประกอบด้วยไฟล์ JSONแล้ว การสนับสนุนสำหรับการจัดการบรรทัดคำสั่งของ JSON นั้นดีมากแล้ว (เช่น: jq )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.