É possível modificar um arquivo yml via script de shell?

9

É assim que meu docker-compose.yml se parece.

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'

Agora eu preciso adicionar algum conteúdo via shell script (em um servidor ubuntu). Não tenho certeza se é possível:

  1. Adicionar novo elemento a nginx/links , se não existir
  2. Anexar newthing bloco se não houver nenhum bloco newthing

O novo conteúdo deve ficar assim:

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'
    
por user3142695 20.01.2017 / 06:23

4 respostas

4

Existem várias bibliotecas yaml para Perl, Python, etc., se não for possível fazer isso diretamente de um shell script, mas usar outra linguagem.

Outra opção é instalar um processador de linha de comando yaml e chamá-lo de seu script de shell.

    
por 20.01.2017 / 09:25
2

Eu escrevi yaml_cli ( link ) para fazer exatamente o que você precisa. É baseado em python. Essa seria a sintaxe do seu exemplo:

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

Feedback sobre yaml_cli é apreciado.

    
por 24.12.2017 / 00:45
1

Eu escrevi link , um wrapper em torno de link , para abordar este caso de uso.

    
por 03.05.2018 / 00:34
0

Como o motivo de você fazer isso é modificar um arquivo de composição do docker, outra alternativa é usar um arquivo JSON. O Docker-compose agora suporta arquivos JSON . Suporte para manipulação de linha de comando de JSONs já é muito bom (ex: jq )

    
por 17.11.2017 / 07:40