有什么办法可以禁用docker-compose.yml中的服务


84

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

当然,我可以将其注释掉,但是是否可以只说“ enabled: false”呢?


3
答案是:“取决于”……取决于您要完成的工作。如果运行docker-compose up,它将默认启动所有服务。但是,如果运行docker-compose up myservice它,将启动myservice及其相关的东西。通过设置依赖项,您可以使依赖项从此命令开始。您也docker-compose run可以获取所需的服务。正确的选择可能是将其拆分为多个撰写文件,以提供所需的灵活性。
Paul Becotte '16

为了处理类似的需求,我在docker -compose up中使用depends_on和service参数,或者在--no-deps不想启动依赖项时使用该选项。我知道这不是您要寻找的东西,但是相反。
贡萨洛(Gonzalo)

另一个选择是根据需要创建尽可能多的docker-compose文件,然后选择要包含在调用中的文件docker-compose -f docker-compose.yml -f another-docker-compose.yml up -d。您可以使用config命令检查生成的docker compose合并:docker-compose -f docker-compose.yml -f another-docker-compose.yml config
Gonzalo


@EshaanBansal我不知道这样的功能。
VonC

Answers:


40

您可以简单地重新定义entrypointcommand,以用什么都不做的东西代替所说的命令(/bin/true

那将使容器立即退出,什么也不做。


shadi在评论中添加了以下提示:

如果您根本不想构建服务,请重新定义构建密钥以指向Dockerfile仅具有以下内容的:

FROM tianon/true 
ENTRYPOINT ["/true"]

5andr0指出评价顶层部分x-disabled:(扩展域样)

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

具有x-前缀的节将被解析,但是如果不按预期方式用作扩展字段,则将忽略这些节。


14
我还将添加/更改restart: "no"以避免无限重启
DUzun

2
这在您要禁用此服务的原因是因为该服务甚至无法启动的情况下无济于事。就我而言,我的postgres无法启动,因为还有另一个postgres实例正在运行,并且ports命令导致冲突。我可以开始更改定义,但是到那时,注释掉整个内容会更容易。
blueFast

1
更加方便:将残障人士服务移至顶层区域,x-disabled:而不是services:
r00

@ 5andr0有趣。该docker-compose部分是否有文档?
VonC

v3.4中引入的docs.docker.com/compose/compose-file/#extension-fields。具有x-前缀的部分将被解析,但如果未按预期方式用作扩展字段,则将被忽略
5andr0

55

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

该文件自动被读取docker-compose并合并到main中docker-compose.yaml

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

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

version: "3"

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

1
如果您有一个“重新启动:除非停止”等注释掉,否则它将不断重新启动
Andreas

想法是更改覆盖文件中的入口点。如果您有重新启动策略,请将其更改为无限睡眠循环
Kos Prov

为了澄清,您可以像在VonC的答案中那样在docker-compose.yml中进行此操作。如果您想签入并与其他开发人员共享,那将是适当的。此外,撰写文件格式v1接受服务名称(在上面的示例中为foo)作为顶级键,而不是“服务”的子键。
丹尼斯·豪

1
如果要为特定环境(例如,开发/登台/生产)禁用/启用服务,则该解决方案效果很好,在该环境中,您使用-f选项为每个环境指定了不同的替代文件。
贾斯汀·埃默里

使用docker-compose v3,我们可以使用env禁用服务,即: export XXX_ENTRYPOINT=/bin/true 然后`入口点:[“ $ {XXX_ENTRYPOINT:-docker-entrypoint.sh}”“]
qxo

9

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

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

无论如何它都会启动,但是什么也没做。


5
重新定义command不会对入口点产生影响。在你的榜样,你靠的entrypointbash我猜。为了使它具有弹性((独立于内置entrypoint),我认为您需要重新定义入口点,而不是命令
。– blueFast


2

我将使用以下命令将服务扩展到0个副本:deploy:副本:0

不幸的是,如文档所述,这仅适用于docker swarm。


-3

我知道了:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.