【问题标题】:Is there any way to disable a service in docker-compose.yml有什么方法可以禁用 docker-compose.yml 中的服务
【发布时间】:2016-05-16 13:16:27
【问题描述】:

我发现自己的情况是,我想暂时禁用 docker-compose 文件中的服务。

当然我可以把它注释掉,但是有什么选择只说“enabled: false”吗?

【问题讨论】:

  • 答案是:“这取决于”……取决于您要完成的工作。如果您运行docker-compose up,它将默认启动所有服务。但是,如果您运行docker-compose up myservice,它将启动 myservice 和依赖它的东西。通过设置依赖项,您可以使其不使用此命令启动不良服务。您也可以通过docker-compose run 获得您想要的服务。正确的选择也可能是将其分解为多个撰写文件,以提供所需的灵活性。
  • 为了处理类似的需求,我使用depends_ondocker-compose up 中的服务参数,或者选项--no-deps,以防您不想启动依赖项.我知道这不是您要寻找的,而是相反的。
  • 另一种选择是根据需要创建尽可能多的 docker-compose 文件,然后选择要在调用 docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d 中包含哪些文件。您可以使用config command:docker-compose -f docker-compose.yml -f another-docker-compose.yml config 检查生成的 docker compose merge
  • 这能回答你的问题吗? Can you define optional docker-compose services?
  • @EshaanBansal 我不知道有这样的功能。

标签: docker docker-compose


【解决方案1】:

自 2021 年 1 月起,有一种方法可以优雅地禁用 docker-compose.yml 中的服务,或者有选择地运行某些服务而不是其他服务。 Docker Compose 1.28.0 引入了对 profiles 键的支持。现在我们可以这样做:

version: "3.9"
services:
  base_image:
    ...
    profiles:
      - donotstart

文档中的示例描述了如何使用此键创建基于命令行上的 --profile 选项一起运行的容器组。在此处查看页面:https://docs.docker.com/compose/profiles/

更新

对配置文件的支持在 Compose V2 beta 5 (docker compose) 中正常工作。 Compose V2 beta 6 已包含在 2021-07-08 发布的 Docker Desktop 3.5.2 中。

【讨论】:

  • 有没有办法告诉 docker 总是 使用一些配置文件?比如配置文件可能是“生产”与“开发”?
  • 您可以使用默认配置文件的名称设置一个环境变量。类似COMPOSE_PROFILES=production
  • 这太不可思议了,应该是使用 Docker Compose v1.28 及更高版本的人的答案。
  • 找到了,没有“默认”配置文件之类的东西。您只是通过提供一个您以后不会调用的命名配置文件来欺骗机制。对吗?
  • @PatrizioBertoni,没错。默认是运行完全没有配置文件的容器。如果容器有配置文件,它只会在您调用该配置文件时运行。我在示例中使用的名称——“donotstart”——完全是任意的。如果你想设置一个配置文件每次都运行,你可以使用COMPOSE_PROFILES 环境变量。我之前将其称为“默认配置文件”可能会混淆一些事情。
【解决方案2】:

您可以在 docker-compose.override.yaml 文件中执行此操作。

此文件由docker-compose 自动读取并合并到主docker-compose.yaml

如果您将其从 Git 中排除,则每个开发人员都可以调整配置(有一些限制),而无需更改原始 docker-compose.yaml

因此,服务foo 可以通过在docker-compose.override.yaml 中重新定义其入口点来临时禁用:

version: "3"

services:
  foo:
    entrypoint: ["echo", "Service foo disabled"]

【讨论】:

  • 如果你有“重启:除非停止”等注释掉,否则它会不断重启
  • 这个想法是改变覆盖文件中的入口点。如果您有重启策略,请将其更改为无限睡眠循环
  • 为了澄清,您可以在 docker-compose.yml 中执行此操作,如 VonC 的回答中所示。如果您想将其签入并与其他开发人员共享,那将是合适的。此外,compose 文件格式 v1 接受服务名称(上例中的 foo)作为顶级键,而不是“服务”的子键。
  • 如果您希望为特定环境(例如开发/登台/生产)禁用/启用服务,在该环境中您使用 -f 选项为每个环境指定了不同的覆盖文件,此解决方案效果很好.
  • 使用 docker-compose v3 我们可以使用 env 禁用服务,即:export XXX_ENTRYPOINT=/bin/true then ` entrypoint: [ "${XXX_ENTRYPOINT:-docker-entrypoint.sh}"]`
【解决方案3】:

您可以简单地重新定义 entrypoint or command 以便将所述命令替换为什么都不做的东西 (/bin/true)

这会使容器立即退出,什么也不做。


shadi 在 cmets 中添加以下提示:

如果您根本不希望构建服务,请重新定义构建键以指向仅具有以下内容的 Dockerfile

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0 指出in the comments top-level section x-disabled:(类似扩展字段)

更方便:将禁用的服务移动到顶级部分 x-disabled: 而不是 services:

带有x- 前缀的部分将被解析,但如果未按预期方式用作扩展字段,则会被忽略。

【讨论】:

  • 我还会添加/更改restart: "no" 以避免无限重启
  • 这在您想要禁用此服务的原因是因为该服务甚至无法启动的情况下没有帮助。就我而言,我的 postgres 没有启动,因为有另一个 postgres 实例正在运行,并且 ports 命令导致冲突。我可以开始更改定义,但此时将整个内容注释掉会更容易。
  • 更方便:将禁用的服务移动到顶级部分 x-disabled: 而不是 services:
  • docs.docker.com/compose/compose-file/#extension-fields 在 v3.4 中引入。带有 x- 前缀的部分将被解析,但如果没有以预期的方式用作扩展字段,则会被忽略
  • @Alies x- 部分是 github.com/compose-spec/compose-spec/blob/master/…,但确实有可能x-disabled 不再有效。
【解决方案4】:

我会将服务扩展到 0 个副本:

deploy:
      replicas: 0

不幸的是,documentation states 这个只适用于 Docker Swarm

【讨论】:

  • "scale: 0" 对我来说可以很好地禁用带有“版本:3.8” docker-compose 文件和 Docker Desktop 3.2.2 的服务
【解决方案5】:

我在要暂时禁用的服务中添加以下额外行:

command: echo "{put your service name here} disabled"

它无论如何都会开始,但什么也不做。

【讨论】:

  • 重新定义command 对入口点没有影响。在您的示例中,您认为 entrypointbash 我猜。为了使其具有弹性((独立于内置的entrypoint),我认为您需要重新定义入口点,而不是命令。
【解决方案6】:

无法禁用 Docker compose yaml 文件中定义的服务。 VonC 的建议是一个很好的解决方法 请参阅下面的 docker compose 文档以获取可用选项 https://docs.docker.com/compose/compose-file/

【讨论】:

    【解决方案7】:

    我明白了:

    docker-compose up $(yq -r '.services | keys | join(" ")' docker-compose.yml | sed 's/service-name//')
    

    【讨论】:

    • 这完全符合我对请求的预期。这不是最容易理解的,但它对我的情况来说已经足够好了,我可以将它集成到我的一些脚本中。
    • yq 版本 4 更新:yq eval '.services | keys | .[] | select(. != "backup")' docker-compose.yml
    【解决方案8】:

    原始但在服务的每行开头添加#

    【讨论】:

    • 问题是关于注释掉服务的替代方法。
    • 你可以有一个100行的服务,加100 #很辛苦:)
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 2013-03-27
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多