Tak wygląda mój 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'
Teraz muszę dodać trochę treści za pomocą skryptu powłoki (na serwerze Ubuntu). Nie jestem do końca pewien, czy jest to w ogóle możliwe:
- Dodaj nowy element
nginx/links
, jeśli nie istnieje - Dołącz
newthing
blok, jeśli nie istnieje blok niczego
Nowa treść powinna wyglądać następująco:
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'
shell-script
ubuntu
text-processing
docker
yaml
użytkownik3142695
źródło
źródło
sed
,awk
iregular expressions
aby zaktualizować plik.ruamel.yaml
bibliotekę Python.Odpowiedzi:
Istnieje wiele bibliotek yaml dla Perla, Pythona itp., Jeśli można to zrobić nie bezpośrednio ze skryptu powłoki, ale użyć innego języka.
Inną opcją jest zainstalowanie procesora yaml z wiersza poleceń i wywołanie go ze skryptu powłoki.
źródło
Napisałem https://github.com/kislyuk/yq , opakowanie wokół https://stedolan.github.io/jq/ , aby rozwiązać ten przypadek użycia.
źródło
yq -y '.newthing=...' input.yml > output.yml
. (Jeśli proszą o aktualizacji w miejscu, jaksed -i
, yq nie może zrobić to samo w sobie jeszcze, ale można użyćsponge
:yq -y .newthing=... file.yml | sponge file.yml
.)Napisałem yaml_cli ( https://github.com/Gallore/yaml_cli ), aby zrobić dokładnie to, czego potrzebujesz. Opiera się na pythonie. Oto przykładowa składnia:
Dziękujemy za opinię na temat yaml_cli.
źródło
Ponieważ powód, dla którego chcesz to zrobić, to zmodyfikować plik komponujący okno dokowane, inną alternatywą jest użycie pliku JSON. Docker-compose obsługuje teraz pliki JSON . Obsługa manipulacji JSON w wierszu polecenia jest już bardzo dobra (np .: jq )
źródło