在另一个 compose 文件中导入 docker compose 文件

Ond*_* K. 23 docker docker-compose

是否可以将 docker-compose 文件“导入”或链接到另一个 docker-compose 文件中?

假设我有两个文件:

# docker-compose-1.yml
services:
    A:
        # config
    B:
        # config
Run Code Online (Sandbox Code Playgroud)
# docker-compose-2.yml
services:
    C:
        # config
    import: docker-compose-1.yml
Run Code Online (Sandbox Code Playgroud)

通过运行docker-compose -f docker-compose-2.yml up,我想启动容器 A、B(在导入的文件中指定)和 C。这可能-f吗,而不必将两个文件与参数链接起来?

Meh*_*ini 20

通过扩展

可以扩展或使用多个 docker-compose 文件及其服务,并将它们链接到一个文件中。您可以查看此链接以了解多个撰写文件的其他用法。但是,如果不按照您提到的将相关文件链接在一起,您还不能包含该文件。

在这里,我定义了一个 common-services.yaml:

version: '2'
    services:
    nginx_a:
        image: nginx:latest
        container_name: nginx
        ports:
         - 81:80
         - 1443:443
Run Code Online (Sandbox Code Playgroud)

然后,我创建了一个 docker-compose.yml 并包含了 common-services.yml 文件和它自己的服务。

services:
   nginx:
     extends:
         file: common-services.yml
         service: nginx_a

   nginx_b:
      image: nginx:latest
      container_name: nginx_b
      volumes:
      ports:
       - 82:80
       - 2443:443
Run Code Online (Sandbox Code Playgroud)

通过 .env 技术

如果你想避免多个文件的链接使用,还有一种使用 .env 文件的技术。我将使用 .env 技术重写前面的示例。

COMPOSE_PATH_SEPARATOR=:
COMPOSE_FILE=common-services.yml:docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

让我们在 common-services.yml 中添加另一个服务作为示例

COMPOSE_PATH_SEPARATOR=:
COMPOSE_FILE=common-services.yml:docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

最后,将它们全部加载到 docker-compose 文件中,甚至不提及这些服务。

 version: '2'
 services:
   ngin_a:
     image: nginx:latest
     container_name: nginx_a
     ports:
       - 81:80
       - 1443:443

   redis_c:
     image: redis:latest
     container_name: redis_c
     ports:
       - 6381:6380
Run Code Online (Sandbox Code Playgroud)

最后,您将拥有三个正在运行的服务。

  • 这在 docker-compose V3 上无效,但他们有一个重新评估它的问题 -> https://github.com/moby/moby/issues/31101 (4认同)

Har*_*var 20

Docker Compose 顶级元素include

include在 Docker Compose 版本2.20及更高版本以及 Docker Desktop 版本4.22及更高版本中可用。

include:
  - shared/docker-compose.yaml
  - docker-compose.prod.yaml

services:
  webapp:
    depends_on:
      - redis
Run Code Online (Sandbox Code Playgroud)

命令将不提及两个文件作为参数-f

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

  • 太好了,这似乎正是我 4 年前所需要的!:) 会测试一下,谢谢。 (4认同)