将多个 .yml 文件传递​​给 docker-compose

cor*_*rvo 1 docker docker-compose

Docker 菜鸟在这里。我的 docker 文件夹中有两个文件 docker-compose.build.yml 和 docker-compose.up.yml 。以下是两个文件的内容..

docker-compose.build.yml

version: "3"
services:

    base:
        build:
          context: ../
          dockerfile: ./docker/Dockerfile.base
          args:
            DEBUG: "true"
        image: ottertune-base
        labels:
          NAME: "ottertune-base"

    web:
        build:
          context: ../
          dockerfile: ./docker/Dockerfile.web
        image: ottertune-web
        depends_on:
          - base
        labels:
          NAME: "ottertune-web"
        volumes:
          - ../server:/app

    driver:
        build:
          context: ../
          dockerfile: ./docker/Dockerfile.driver
        image: ottertune-driver
        depends_on:
          - base
        labels:
          NAME: "ottertune-driver"
Run Code Online (Sandbox Code Playgroud)

docker-compose.up.yml

version: "3"
services:

    web:
        image: ottertune-web
        container_name: web
        expose:
          - "8000"
        ports:
          - "8000:8000"
        links:
          - backend
          - rabbitmq
        depends_on:
          - backend
          - rabbitmq
        environment:
          DEBUG: 'true'
          ADMIN_PASSWORD: 'changeme'
          BACKEND: 'postgresql'
          DB_NAME: 'ottertune'
          DB_USER: 'postgres'
          DB_PASSWORD: 'ottertune'
          DB_HOST: 'backend'
          DB_PORT: '5432'
          DB_OPTS: '{}'
          MAX_DB_CONN_ATTEMPTS: 30
          RABBITMQ_HOST: 'rabbitmq'
        working_dir: /app/website
        entrypoint: ./start.sh
        labels:
          NAME: "ottertune-web"
        networks:
          - ottertune-net


    driver:
        image: ottertune-driver
        container_name: driver
        depends_on:
          - web
        environment:
          DEBUG: 'true'
        working_dir: /app/driver
        labels:
          NAME: "ottertune-driver"
        networks:
          - ottertune-net

    rabbitmq:
        image: "rabbitmq:3-management"
        container_name: rabbitmq
        restart: always
        hostname: "rabbitmq"
        environment:
           RABBITMQ_DEFAULT_USER: "guest"
           RABBITMQ_DEFAULT_PASS: "guest"
           RABBITMQ_DEFAULT_VHOST: "/"
        expose:
           - "15672"
           - "5672"
        ports:
           - "15673:15672"
           - "5673:5672"
        labels:
           NAME: "rabbitmq"
        networks:
          - ottertune-net

    backend:
        container_name: backend
        restart: always
        image: postgres:9.6
        environment:
          POSTGRES_USER: 'postgres'
          POSTGRES_PASSWORD: 'ottertune'
          POSTGRES_DB: 'ottertune'
        expose:
          - "5432"
        ports:
          - "5432:5432"
        labels:
          NAME: "ottertune-backend"
        networks:
          - ottertune-net

networks:
   ottertune-net:
      driver: bridge
Run Code Online (Sandbox Code Playgroud)

dockerfiles 没有问题,我只是对这种方法有一些疑问。

  1. 拥有多个文件而不是一个 docker-compose.yml 的目的是什么?
  2. docker-compose 在与多个文件一起使用时如何工作?
  3. 当我做 docker-compose -f docker-compose.build.yml build --no-cache
Building base
Step 1/1 : FROM ubuntu:18.04
---> 775349758637
[Warning] One or more build-args [DEBUG] were not consumed
Successfully built 775349758637
Successfully tagged ottertune-base:latest
Building web
Step 1/1 : FROM ottertune-base
---> 775349758637
Successfully built 775349758637
Successfully tagged ottertune-web:latest 
Building driver
Step 1/1 : FROM ottertune-base
---> 775349758637
Successfully built 775349758637
Successfully tagged ottertune-driver:latest 
Run Code Online (Sandbox Code Playgroud)

然后docker-compose up我得到了错误

rabbitmq is up-to-date                                                                                                                                                                       
backend is up-to-date                                                                                                                                                                        Starting web ... error                                                                                                                                                                                                                                                                                                                                                                    
ERROR: for web  Cannot start service web: OCI runtime create failed: container_linux.go:346: 
starting container process caused "exec: \"./start.sh\": stat ./start.sh: no such file or 
directory": unknown                                                                                                                                                                                                                                                                                                                                                                             
ERROR: for web  Cannot start service web: OCI runtime create failed: container_linux.go:346: 
starting container process caused "exec: \"./start.sh\": stat ./start.sh: no such file or 
directory": unknown                                                                                                                                                                                
ERROR: Encountered errors while bringing up the project.
Run Code Online (Sandbox Code Playgroud)

这个入口点 start.sh 是在 docker-compose.up.yml 文件中定义的,我没有将其作为参数传递给

docker-compose build

那么,为什么要docker-compose up尝试从 yml 文件中运行此入口点,该文件甚至在构建过程中都没有通过?真的很困惑,在谷歌和stackoverflow上没有找到太多关于它的信息。

Nee*_*ath 7

拥有多个文件而不是只有一个 docker-compose.yml 有何用途?

您可以跨环境共享配置。例如,我将网络和服务器等常用配置保存在docker-compose.yml. 我保留我的开发环境细节,例如在docker-compose.override.yml. 我将特定于生产的配置保存在docker-compose.prod.yml. 然后我可以docker-compose up --build在我的开发环境中运行(Docker Compose默认使用)docker-compose.ymldocker-compose.override.yml我可以使用 运行我的产品环境docker-compose -f docker-compose.yml -f docker-compose.prod.yml up --build您可以在专门的文档页面中阅读相关内容。

docker-compose 与多个文件一起使用时如何工作?

它将第一个文件作为基础文件,并添加或替换基础文件中后续文件中的配置。请参阅相关文档

当我执行 docker-compose -f docker-compose.build.yml build --no-cache ...

至于你的最后一个问题,根据我所看到的情况,我无法判断。但与Dockerfiles 需要两个命令(docker builddocker run)不同,docker-compose它只需要一个。因此,当您这样做时docker-compose up,它会查找名为的文件docker-compose.ymldocker-compose.override.yml如果存在)。


Dav*_*aze 5

如果是docker-compose -f a.yml -f b.yml ...Docker Compose 会合并两个 YAML 文件。如果您查看您发布的两个文件,其中一个具有所有运行时设置(ports:environment:、 ...),如果您碰巧已经拥有图像,则足以运行应用程序。第二个只有构建时设置 ( build:),但需要在本地检出的源代码树才能运行。

您可能需要在每次docker-compose调用时指定这两个文件

docker-compose -f docker-compose.build.yml -f docker-compose.up.yml up --build
Run Code Online (Sandbox Code Playgroud)

这些文件的作者似乎确实打算让它们单独运行

docker-compose -f docker-compose.build.yml build
docker-compose -f docker-compose.up.yml up
Run Code Online (Sandbox Code Playgroud)

但请注意,构建文件中的某些运行时选项(例如volumes:隐藏内置于映像中的应用程序)永远不会生效。

(你应该能够删除在“向上” YAML文件,要么重复图像或泊坞撰写有什么可以为您提供了大量的设置:container_name:expose:links:working_dir:entrypoint:networks:,和(可能)labels:都是不必要的,可以删除。)