Có thể sửa đổi một tập tin yml thông qua shell script?


11

Đây là cách docker-compose.yml của tôi trông như thế nào.

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'

Bây giờ tôi cần thêm một số nội dung thông qua shell script (trên máy chủ ubfox). Tôi không chắc lắm nếu có thể:

  1. Thêm phần tử mới vào nginx/links, nếu nó không tồn tại
  2. Nối newthingkhối nếu không có khối thứ mới

Nội dung mới sẽ trông như thế này:

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
Shell cung cấp cho bạn ngôn ngữ kịch bản rất mạnh mẽ. Bạn có thể dễ dàng viết một kịch bản sử dụng sed, awkregular expressionsđể cập nhật tập tin của bạn.
hóa thạch

Bạn có thể vui lòng cung cấp một ví dụ nhỏ?
dùng3142695

2
Mặc dù về mặt kỹ thuật có thể sử dụng shell, nhưng bạn nên sử dụng một ngôn ngữ có thư viện yaml thực tế.
jordanm

Tôi sẽ khuyên bạn nên kiểm tra ruamel.yamlthư viện cho Python.
phk

Tôi nghĩ rằng đáng chú ý rằng các liên kết là một tính năng cũ sẽ bị xóa khỏi docker
Mikael Kjær

Câu trả lời:


6

Có một số thư viện yaml cho Perl, Python, v.v. nếu bạn có thể làm điều đó không trực tiếp từ tập lệnh shell, mà sử dụng ngôn ngữ khác.

Một tùy chọn khác là cài đặt bộ xử lý yaml dòng lệnh và gọi nó từ tập lệnh shell của bạn.


8

Tôi đã viết https://github.com/kislyuk/yq , một trình bao bọc xung quanh https://stedolan.github.io/jq/ , để giải quyết trường hợp sử dụng này.


Nó có thể cập nhật không?
weynhamz

1
Có : yq -y '.newthing=...' input.yml > output.yml. (Nếu bạn đang hỏi về một bản cập nhật tại chỗ, như sed -i, bạn không thể tự làm điều đó, nhưng bạn có thể sử dụng sponge: yq -y .newthing=... file.yml | sponge file.yml.)
thợ dệt

1
@weaver bạn là anh hùng mới của tôi
voutasaurus

7

Tôi đã viết yaml_cli ( https://github.com/Gallore/yaml_cli ) để làm chính xác những gì bạn cần. Nó dựa trên con trăn. Đây sẽ là cú pháp cho ví dụ của bạn:

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'     #

Phản hồi về yaml_cli được đánh giá cao.


1

Vì lý do bạn muốn làm điều này là để sửa đổi tệp soạn thảo docker, nên một cách khác là sử dụng tệp JSON. Docker-compose hiện hỗ trợ các tệp JSON . Hỗ trợ thao tác JSON dòng lệnh đã rất tốt (ví dụ: jq )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.