你能定义可选的docker-compose服务吗?

52

有没有一种方法可以定义一个Docker Compose服务,以便只有在显式请求时才会启动它?

也就是说:

docker-compose up

不会启动它,但是

docker-compose up optional_service

可能需要使用 extends - Oliver Charlesworth
3
相关:请求在Docker Compose中明确支持此行为的添加:https://github.com/docker/compose/issues/1896 - jwodder
对我来说,你已经回答了自己的问题。docker-compose up optional_service不起作用? - hnandarusdy
2
问题在于,当您调用docker-compose up时,optional_service也将启动。 - Dancrumb
3个回答

68

Docker compose 现在支持配置文件profiles,它允许您 a) 默认禁用一个或多个服务,以及b) 当使用相应的 --profile 参数运行docker-compose时启用它们。

通过在 docker-compose.yml 文件中的服务上添加 profiles 关键字来实现此功能。没有此关键字的服务始终由docker-compose启动(对于所有profiles)。

例如,使用以下docker-compose.yml文件

version: '3.9'
services
  app_service:
    # ...
  test_service:
    profiles:
      - testing
    # ...

运行 docker-compose up 只会启动 app_service,而运行 docker-compose --profile testing up 会同时启动 app_servicetest_service

可以通过传递多个 --profile 标记来指定多个配置文件。

更多信息请参见:https://docs.docker.com/compose/profiles/

编辑:我必须升级到 Docker 引擎 v20.10.5 才能使用此功能。


38

实现这一点的一种方法是在不同的Compose文件中定义您的可选服务。然后启动可选服务,运行:

$ docker-compose -f docker-compose.yml -f optional-service.yaml up
例如,如果我有一个看起来像这样的docker-compose.yml文件:
version: '2.1'
services:
  lb:
    image: nginx:1.13           
  db:
    image: redis:3.2.9

我可以使用一个类似以下文件的 optional-service.yml 来扩展它:

version: '2.1'
services:
  busy:
    image: busybox

请注意,两个Compose文件必须使用相同的Compose文件版本。

您可以在Compose 文档中了解更多信息。


你能够将这些服务链接起来吗? - Dancrumb
4
默认情况下,Compose 项目中的所有服务都会添加到同一个网络中,而无需互相链接。运行 docker-compose up 命令,然后执行 docker network ls 命令,您将看到一个以 Compose 项目名称命名的网络被添加。这是 Compose 网络的链接 - ivan.sim
更新命令为 docker-compose -f docker-compose.yml -f optional-service.yml up! - Horrible Programmer

17

extend 关键字在版本 3.x 中已被移除。

我曾经遇到了同样的问题,这是我的解决方法:

  • 从 Docker 的官方文档中,我们可以在 .env 文件中使用一个名为 COMPOSE_FILE 的环境变量。
  • 它的工作方式是:当你执行 docker-compose up 命令时,它将不再读取 docker-compose.yml 文件,而是读取所有在 COMPOSE_FILE 变量中指定的 compose 文件。

例如:

COMPOSE_FILE=docker-compose.yml:./optional/docker-compose.prod.yml
  • 好处是:
    • 如果.env文件与docker-compose.yml在同一级别下,那么在调用docker-compose up时,该文件会被自动读取。
    • 无需在CLI中使用-f标志指定每个文件。
  • 唯一缺点是:需要为您希望使其变为可选的每个服务创建单独的compose文件。

注意:在Linux中使用:分隔文件名,在Windows中使用;分隔文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接