首页 > 解决方案 > 如何以编程方式从 docker-compose.yml 中删除服务?

问题描述

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

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

标签: bashdocker-compose

解决方案


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

推荐阅读