有没有办法在docker-compose.yml中禁用服务

Man*_*gor 50 docker docker-compose

我发现自己处于这种情况,我想暂时禁用docker-compose文件中的服务.

当然我可以发表评论,但有没有选择只说" enabled: false"?

mca*_*son 79

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

version: "3.9"
services:
  base_image:
    ...
    profiles:
      - donotstart
Run Code Online (Sandbox Code Playgroud)

文档中的示例描述了如何使用此密钥创建基于--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 中

  • 您可以使用默认配置文件的名称设置一个环境变量。类似“COMPOSE_PROFILES=生产”之类的东西。 (3认同)
  • 这是令人难以置信的,并且应该是使用 Docker Compose v1.28 及更高版本的人们的答案。 (3认同)
  • @PatrizioBertoni,是的。默认情况下运行根本没有配置文件的容器。如果容器具有配置文件,则仅当您调用该配置文件时才会运行它。我在示例中使用的名称“donotstart”完全是任意的。如果您想设置每次运行的配置文件,可以使用“COMPOSE_PROFILES”环境变量。我可能会因为之前将其称为“默认配置文件”而感到困惑。 (3认同)
  • 我已经等待这样的事情很多年了。谢谢。 (2认同)
  • 发现了,没有“默认”配置文件之类的东西。简而言之,您通过提供稍后不会调用的命名配置文件来欺骗该机制。正确的? (2认同)

Ali*_*i80 34

将服务分配给配置文件

services:
  dev_service:
    ...
    profiles: ["dev"] # only runs with dev profile
Run Code Online (Sandbox Code Playgroud)

使用启用配置文件

docker compose --profile dev up
Run Code Online (Sandbox Code Playgroud)

参考: https: //docs.docker.com/compose/profiles/

  • 天啊!这真太了不起了。我可以请你喝杯咖啡来回答这个问题吗? (3认同)

Von*_*onC 27

你可以简单地重新定义entrypoint或者command用一些什么都不做的东西替换所说的命令(/bin/true)

这将使容器立即退出,什么都不做.


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

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

FROM tianon/true 
ENTRYPOINT ["/true"]
Run Code Online (Sandbox Code Playgroud)

  • 我还要添加/更改`restart:"no"`以避免无限重启 (8认同)
  • 如果您要禁用此服务的原因是该服务甚至无法启动,则这无济于事。在我的情况下,我 postgres 没有启动,因为有另一个 postgres 实例正在运行,并且端口命令导致冲突。我可以开始更改定义,但在那时将整个内容注释掉会更容易。 (2认同)
  • 更方便:将禁用的服务移至顶级部分“x-disabled:”而不是“services:” (2认同)

her*_*erm 18

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

deploy:
      replicas: 0
Run Code Online (Sandbox Code Playgroud)

不幸的是,正如文档所述,这只适用于 Docker Swarm

  • “scale: 0”对我来说可以很好地禁用具有“version: 3.8”docker-compose 文件和 Docker Desktop 3.2.2 的服务 (3认同)

Kos*_*rov 16

您可以在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"]
Run Code Online (Sandbox Code Playgroud)

  • 如果您有“重新启动:除非-停止”等注释掉,否则它将不断重新启动 (3认同)

Mic*_*nno 6

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

command: echo "{put your service name here} disabled"
Run Code Online (Sandbox Code Playgroud)

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

  • 重新定义`command`对入口点没有影响.在你的例子中,你认为`入口点'是'bash`我猜.为了使其具有弹性((独立于内置的"入口点"),我认为您需要重新定义入口点,而不是命令. (3认同)