【问题标题】:How to remove service from docker-compose.yml programmatically?如何以编程方式从 docker-compose.yml 中删除服务?
【发布时间】:2019-06-12 21:32:03
【问题描述】:

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

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

【问题讨论】:

  • 这是一个 X-Y 问题,我认为:docker-compose 文件是如何在其中包含冗余服务的?是什么阻止您编写只会启动您需要的服务的脚本(或 make 文件)? (runnign docker-compose up service_1 service_3 将跳过 service_2)...请详细说明您为什么需要它,并向我们展示您的尝试
  • @EliasVanOotegem 谢谢,我更新了问题

标签: bash docker-compose


【解决方案1】:

你只能启动你命名的服务,例如启动service_1service_3你可以运行:

docker-compose up service_1 service_3

如果你想编辑 docker-compose 文件,你可以简单地在文本编辑器中编辑它并删除你不需要的服务。以编程方式,您可以使用 pythonPyYaml 库来做到这一点。

您也可以使用awk 删除服务,但需要更多工作...

【讨论】:

  • 感谢您的回答,但我无法使用 python 或其他第三方软件,因为它可能未安装在系统上
  • @AlexanderVolkov 然后安装它?
  • 不幸的是,不同的环境有不同的安装方式,但我尝试创建通用脚本。此外,我正在努力保持系统尽可能清晰,而不是安装仅用于操作的程序。
  • @AlexanderVolkov 如果我可能会问,为什么你需要首先从 docker-compose 文件中删除服务,而你可以简单地启动命名服务?
  • @user7440787,因为我想保留 docker-compose.yml 实际,删除的服务将不再需要
【解决方案2】:

我编写了从docker-compose.yml 删除服务的bash 脚本。主要思想是逐行读取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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多