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

将多个.yml文件传递给docker compose,docker,docker-compose,Docker,Docker Compose,这里是Docker noob。 我的docker文件夹中有两个文件docker-compose.build.yml和docker-compose.up.yml。以下是两个文件的内容 docker-compose.build.yml version: "3" services: base: build: context: ../ dockerfile: ./docker/Dockerfile.base args:

这里是Docker noob。 我的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"
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
dockerfiles没有问题,我只是对这种方法有一些怀疑

  • 多个文件而不是一个docker-compose.yml有什么作用
  • docker compose与多个文件一起使用时如何工作
  • 当我执行
    docker-compose-f docker-compose.build.yml build时--没有缓存
  • 然后,
    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.
    
    这个entrypoint start.sh是在docker-compose.up.yml文件中定义的,我没有将其作为参数传递给它

    docker编写构建

    那么,
    docker compose up
    为什么要从一个在构建过程中甚至没有传递的yml文件运行这个入口点呢?对此非常困惑,在谷歌和stackoverflow上没有找到太多相关信息

    多个文件而不是一个docker-compose.yml有什么作用

    您可以跨环境共享配置。例如,我将常见配置(如网络和服务器)保存在
    docker compose.yml
    中。我保留我的开发环境细节,例如在
    docker compose.override.yml中启用自动重新加载和调试的服务器。我将特定于生产的配置保存在
    docker compose.prod.yml
    中。然后我可以为我的开发环境运行
    docker compose up--build
    (默认情况下,docker compose使用
    docker compose.yml
    docker compose.override.yml
    )。我可以使用
    docker-compose-f docker-compose.yml-f docker-compose.prod.yml-up--build
    运行我的prod环境。你可以在专门的网站上看到这一点

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

    它将第一个文件作为基础文件,并在基础文件的后续文件中添加或替换配置。看

    当我执行docker compose-f docker-compose.build.yml build时--没有缓存

    至于你的最后一个问题,我看不出我看到了什么。但是与需要两个命令(
    dockerbuild
    dockerrun
    )的
    Dockerfile
    不同,
    dockercompose
    只需要一个命令。因此,当您执行
    docker compose up
    时,它会查找名为
    docker compose.yml
    (如果存在
    docker compose.override.yml
    )的文件

    多个文件而不是一个docker-compose.yml有什么作用

    您可以跨环境共享配置。例如,我将常见配置(如网络和服务器)保存在
    docker compose.yml
    中。我保留我的开发环境细节,例如在
    docker compose.override.yml中启用自动重新加载和调试的服务器。我将特定于生产的配置保存在
    docker compose.prod.yml
    中。然后我可以为我的开发环境运行
    docker compose up--build
    (默认情况下,docker compose使用
    docker compose.yml
    docker compose.override.yml
    )。我可以使用
    docker-compose-f docker-compose.yml-f docker-compose.prod.yml-up--build
    运行我的prod环境。你可以在专门的网站上看到这一点

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

    它将第一个文件作为基础文件,并在基础文件的后续文件中添加或替换配置。看

    当我执行docker compose-f docker-compose.build.yml build时--没有缓存


    至于你的最后一个问题,我看不出我看到了什么。但是与需要两个命令(
    dockerbuild
    dockerrun
    )的
    Dockerfile
    不同,
    dockercompose
    只需要一个命令。因此,当您执行
    docker compose up
    时,它会查找名为
    docker compose.yml
    (如果存在
    docker compose.override.yml
    )的文件。

    如果
    docker compose-f a.yml-f b.yml…
    。如果您查看已发布的两个文件,其中一个文件具有所有运行时设置(
    端口:
    环境:
    ,…),如果您碰巧已经有了这些图像,则足以运行应用程序。第二个只有构建时设置(
    构建:
    ),但需要在本地签出的源树才能运行

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

    docker-compose -f docker-compose.build.yml -f docker-compose.up.yml up --build
    
    这些文件的作者似乎打算让它们单独运行

    docker-compose -f docker-compose.build.yml build
    docker-compose -f docker-compose.up.yml up
    
    但是请注意,构建文件中的一些运行时选项,如
    volumes:
    隐藏映像中内置的应用程序,将永远不会生效


    (您应该能够删除“up”YAML文件中的大量设置,这些设置要么复制图像中的内容,要么Docker Compose可以为您提供:
    容器名称:
    暴露:
    链接:
    工作目录:
    入口点:
    网络:
    ,以及(可能)
    标签:
    都是不必要的,可以删除。)

    如果您
    docker compose-f a.yml-f b.yml…
    。如果您查看已发布的两个文件,其中一个文件具有所有运行时设置(
    端口:
    环境:
    ,…),如果您碰巧已经有了这些图像,则足以运行应用程序。第二个只有构建时设置(
    构建:
    ),但需要在本地签出的源树才能运行

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

    docker-compose -f docker-compose.build.yml -f docker-compose.up.yml up --build
    
    这些文件的作者似乎打算让它们单独运行

    docker-compose -f docker-compose.build.yml build
    docker-compose -f docker-compose.up.yml up
    
    但请注意,中的一些运行时选项