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

Dan*_*umb 12 docker docker-compose

有没有办法定义一个Docker Compose服务,只有up在你明确请求它时它才会被带来?

也就是说:

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

不会启动它,但是

docker-compose up optional_service
Run Code Online (Sandbox Code Playgroud)

将.

iva*_*sim 18

实现此目的的一种方法是在不同的撰写文件中定义可选服务.然后启动可选服务,运行:

$ docker-compose -f docker-compose.yml -f optional-service.yaml up
Run Code Online (Sandbox Code Playgroud)

例如,如果我有一个docker-compose.yaml文件,如下所示:

version: '2.1'
services:
  lb:
    image: nginx:1.13           
  db:
    image: redis:3.2.9
Run Code Online (Sandbox Code Playgroud)

我可以使用一个看起来如下的可选service.yaml来扩展它:

version: '2.1'
services:
  busy:
    image: busybox
Run Code Online (Sandbox Code Playgroud)

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

您可以在Compose 文档中阅读有关它的更多信息.

  • 默认情况下,Compose项目中的所有服务都添加到同一网络,而无需相互链接.运行`docker-compose up`,然后执行`docker network ls`.您将看到一个以您的Compose项目名称命名的网络.这是撰写网络的[link](https://docs.docker.com/compose/networking/). (3认同)

小智 14

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

这是通过profilesdocker-compose.yml文件中为您的服务添加一个密钥来完成的。没有此密钥的服务始终由 docker-compose 启动(对于所有配置文件)。

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

version: '3.9'
services
  app_service:
    # ...
  test_service:
    profiles:
      - testing
    # ...
Run Code Online (Sandbox Code Playgroud)

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

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

更多信息可以在这里找到:https : //docs.docker.com/compose/profiles/

编辑:我必须更新到 docker 引擎 v20.10.5 才能工作。


Esh*_*an7 12

extend关键字已在版本中删除3.x

我遇到了同样的问题,这就是我所做的:

  • 从 Docker 的官方文档中,我们可以COMPOSE_FILE.env文件中使用环境变量。
  • 它的工作方式是:当你这样做时,它会读取变量中指定的所有撰写文件docker-compose up,而不是读取。docker-compose.ymlCOMPOSE_FILE

例如,

COMPOSE_FILE=docker-compose.yml:./optional/docker-compose.prod.yml
Run Code Online (Sandbox Code Playgroud)
  • 相当一部分是:
    • .env文件是自动读取(如果位于同一水平docker-compose.yml),当我们调用docker-compose up
    • 无需-f在 CLI 中使用标志指定每个文件。
  • 一个缺点是:需要建立单独的撰写文件要进行选择性各项服务。

注意::在 linux 或;windows 的情况下用 a 分隔文件名。