Bash 如何以编程方式从docker-compose.yml中删除服务?
我正在创建一个删除docker服务的bash脚本。 我有以下docker-compose.yml文件:Bash 如何以编程方式从docker-compose.yml中删除服务?,bash,docker-compose,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/so
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
我想从此文件中删除一些服务(例如服务_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中将其删除,因为不需要将其保留在那里。您只能启动您命名的服务,例如启动服务1
和服务3
您可以运行:
docker组合服务\u 1服务\u 3
如果要编辑docker compose文件,只需在文本编辑器中编辑它,然后删除不需要的服务。通过编程,您可以使用python
和PyYaml
库来实现这一点
您也可以使用
awk
删除服务,但需要做更多的工作…我编写bash脚本,从docker compose.yml
中删除服务。主要思想是逐行读取docker compose.yml
,并将字符串与服务声明start进行比较。在找到服务声明之前,将行放入临时文件。一旦服务声明找到,脚本就会停止打印临时文件中的行。当找到下一个服务声明时,脚本开始再次向临时文件打印行。然后,临时文件复制到源文件
#!/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
#/bin/bash
服务名称=$1
tmp=$(mktemp)
服务\u开始\u正则表达式=“^\s{3}$service\u名称:\s*$”
next_service_start_regex=“^\s{3}[a-zA-Z0-9+:\s*$”
state=“loud”
而IFS=读取-r行;做
如果[[“$line”=~$service\u start\u regex]];然后
state=“静默”
fi
如果[[“$line”=~$next_service_start_regex&&!”$line”=~$service_start_regex&&“$state”==“silent”];然后
state=“loud”
fi
如果[[$state==“loud”];然后
printf“%s\n”$line
fi
完成<./docker-compose.yml>“$tmp”和&mv“$tmp”docker-compose.yml
谢谢您的回答,但我不能使用python或其他第三方软件,因为它可能未安装在system@AlexanderVolkov然后安装它?不幸的是,不同的环境有不同的安装方式,但我尝试创建脚本universal。此外,我正在尽可能使系统保持清晰,而不是安装仅用于操作的程序。@AlexanderVolkov如果我可以问的话,为什么您需要首先从docker compose文件中删除服务,而您只需启动命名服务?@user7440787,因为我想保留docker-compose.yml实际和已删除的服务将不再需要这是一个X-Y问题,我想:docker-compose文件如何在其中包含冗余服务?是什么阻止您编写只会启动所需服务的脚本(或生成文件)?(运行docker组合服务\u 1服务\u 3
将跳过service\u 2
)。。。请详细说明您为什么需要这个,并向我们展示您所拥有的tried@EliasVanOotegem谢谢,我更新问题