Как удалить сервис из docker-compose.yml программно? - PullRequest
0 голосов
/ 18 января 2019

Я создаю bash-скрипт, который удаляет сервис Docker. У меня есть следующий файл docker-compose.yml:

version: '2'

services:
   service_1:
     image: vendor/some_image

   service_2:
     image: vendor/some_image
     volumes:
       - ../service_2/www:/var/www

   service_3:
     image: vendor/some_image
     volumes:
       - ../service_3/www:/var/www
       - ../service_3/tests:/test

Я хочу удалить какой-то сервис (например, service_2) из ​​этого файла, чтобы получить следующее:

version: '2'

services:
   service_1:
     image: vendor/some_image

   service_3:
     image: vendor/some_image
     volumes:
       - ../service_3/www:/var/www
       - ../service_3/tests:/test

Как я могу это сделать? docker-compose есть какая-то команда для этого? Может быть, я могу сделать это, используя sed или awk? Проблема в том, что я не могу использовать стороннее программное обеспечение, потому что среда, в которой будет выполняться мой bash-скрипт, может не иметь его.

UPD: Файл docker-compose.yml имеет много сервисов (> 50). Все услуги должны быть в любое время. Но иногда какой-то сервис больше не требуется. Я пишу скрипт, который навсегда удаляет сервис (остановка контейнера, очистка конфигов, удаление исходных файлов, удаление баз данных и т. Д.). Последним этапом процесса удаления службы является удаление его в docker-compose.yml, поскольку хранить его там не нужно.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Я пишу bash-скрипт, который удаляет сервис из docker-compose.yml. Основная идея состоит в том, чтобы читать docker-compose.yml строка за строкой и сравнивать строку с началом объявления сервиса. Строки помещаются во временный файл до тех пор, пока не будет найдено объявление сервиса. Как только объявление службы найдено, скрипт перестает печатать строки во временном файле. Когда сценарий следующего объявления службы найден, он снова начинает печатать строки во временном файле. После этого временный файл копируется в исходный файл.

#!/bin/bash

SERVICE_NAME=$1
tmp=$(mktemp)

service_start_regex="^\s{3}$SERVICE_NAME:\s*$"
next_service_start_regex="^\s{3}[a-zA-Z0-9_]+:\s*$"

state="loud"
while IFS= read -r line; do
    if [[ "$line" =~ $service_start_regex ]]; then
        state="silent"
    fi

    if [[ "$line" =~ $next_service_start_regex && ! "$line" =~ $service_start_regex && "$state" == "silent" ]]; then
        state="loud"
    fi

    if [[ $state == "loud" ]]; then
        printf "%s\n" "$line"
    fi
done < ./docker-compose.yml > "$tmp" && mv "$tmp" docker-compose.yml
0 голосов
/ 18 января 2019

вы можете запустить только те службы, которые вы назвали, например, для запуска service_1 и service_3, которые вы можете запустить:

docker-compose up service_1 service_3

Если вы хотите редактировать файл docker-compose, вы можете просто отредактировать его в текстовом редакторе и удалить ненужные вам сервисы. Программно вы можете сделать это, используя библиотеки python и PyYaml.

Вы также можете использовать awk для удаления сервисов, но требует немного больше работы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...