我正在创建一个删除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
是否为此有一些命令?
也许我可以使用sed
或awk
来做到这一点?问题是我不能使用第三方软件,因为执行我的bash脚本的环境可能没有它。
UPD:
docker-compose.yml
文件有很多服务(> 50)。每次都应启动所有服务。但有时不再需要某些服务。我编写了永久删除服务(停止容器,清除配置,删除源文件,删除数据库等)的脚本。服务删除过程的最后一步是在docker-compose.yml
中将其删除,因为没有必要将其保留在那里。
答案 0 :(得分:1)
您只能启动您命名的服务,例如,启动service_1
和service_3
可以运行:
docker-compose up service_1 service_3
如果您要编辑docker-compose文件,则只需在文本编辑器中对其进行编辑,然后删除不需要的服务。您可以通过编程方式使用python
和PyYaml
库。
您还可以使用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