如何以编程方式从docker-compose.yml删除服务?

时间:2019-01-18 15:30:28

标签: bash docker-compose

我正在创建一个删除docker服务的bash脚本。 我有以下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是否为此有一些命令? 也许我可以使用sedawk来做到这一点?问题是我不能使用第三方软件,因为执行我的bash脚本的环境可能没有它。

UPD: docker-compose.yml文件有很多服务(> 50)。每次都应启动所有服务。但有时不再需要某些服务。我编写了永久删除服务(停止容器,清除配置,删除源文件,删除数据库等)的脚本。服务删除过程的最后一步是在docker-compose.yml中将其删除,因为没有必要将其保留在那里。

2 个答案:

答案 0 :(得分:1)

您只能启动您命名的服务,例如,启动service_1service_3可以运行:

docker-compose up service_1 service_3

如果您要编辑docker-compose文件,则只需在文本编辑器中对其进行编辑,然后删除不需要的服务。您可以通过编程方式使用pythonPyYaml库。

您还可以使用awk删除服务,但需要做更多的工作...

答案 1 :(得分:0)

我编写了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