Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何以编程方式从docker-compose.yml中删除服务?_Bash_Docker Compose - Fatal编程技术网

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

我正在创建一个删除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
我想从此文件中删除一些服务(例如服务_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谢谢,我更新问题