쉘 스크립트를 통해 yml 파일을 수정할 수 있습니까?

쉘 스크립트를 통해 yml 파일을 수정할 수 있습니까?

이것이 내 docker-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'

이제 (우분투 서버에서) 쉘 스크립트를 통해 뭔가를 추가해야 합니다. 이것이 가능한지 확실하지 않습니다.

  1. nginx/links존재하지 않는 경우 새 요소 추가
  2. newthingnewthing-block이 없으면 블록을 추가합니다.

새 콘텐츠는 다음과 같아야 합니다.

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

나는 썼다https://github.com/kislyuk/yq, 래퍼https://stedolan.github.io/jq/, 이 사용 사례를 해결하려면.

답변2

나는 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에 대한 피드백을 환영합니다.

답변3

Perl, Python 등을 위한 많은 yaml 라이브러리가 있습니다. 쉘 스크립트에서 직접 수행할 수 없다면 다른 언어를 사용하십시오.

또 다른 옵션은 명령줄을 설치하는 것입니다.YAML 프로세서를 누른 다음 쉘 스크립트에서 호출합니다.

답변4

이를 수행하려는 이유는 docker-compose 파일을 수정하기 위한 것이므로 또 다른 옵션은 JSON 파일을 사용하는 것입니다. Docker-compose는 이제 다음을 지원합니다.JSON 파일. JSON 명령줄 작업에 대한 지원은 이미 매우 훌륭합니다(예:)

관련 정보