将多个.yml文件传递给docker compose
这里是Docker noob。 我的docker文件夹中有两个文件docker-compose.build.yml和docker-compose.up.yml。以下是两个文件的内容 docker-compose.build.yml将多个.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:
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-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
但请注意,中的一些运行时选项