bash - 如何以编程方式从 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
对此有什么命令吗?也许我可以使用sed
or来做到这一点awk
?问题是我不能使用第三方软件,因为执行我的 bash 脚本的环境可能没有它。
UPD:该docker-compose.yml
文件有很多服务 (>50)。所有服务都应该随时启动。但有时某些服务不再需要。我编写了永远删除服务的脚本(停止容器、清除配置、删除源文件、删除数据库等)。服务删除过程的最后一步是将其删除,docker-compose.yml
因为没有必要将其保留在那里。
解决方案
我编写 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
推荐阅读
- python - (Python)即使满足 IF 也会执行 ELSE?
- data-structures - 将两个数组合并为一个列表后无法打印链表中的元素
- reactjs - 在反应中共享功能的最佳方式
- google-admin-sdk - Admin SDK 生成访问重置密码页面的链接
- python - 用熊猫转换格式不正确的字典
- python - 如何使用元组作为 attr.ib 的转换器而不扰乱 mypy?
- python-3.x - VSCode中python3的sqlite语法高亮
- java - 有什么方法可以让 JPA 更快地持久化对象?
- .net-core - .net 核心 API / 云运行中系统 SocketException 中打开的文件过多
- java - 使用 Java 可定制的井字游戏板