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 没有问题,我只是对这种方法有一些疑问。
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上没有找到太多关于它的信息。
拥有多个文件而不是只有一个 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。您可以在专门的文档页面中阅读相关内容。
docker-compose 与多个文件一起使用时如何工作?
它将第一个文件作为基础文件,并添加或替换基础文件中后续文件中的配置。请参阅相关文档。
当我执行 docker-compose -f docker-compose.build.yml build --no-cache ...
至于你的最后一个问题,根据我所看到的情况,我无法判断。但与Dockerfiles 需要两个命令(docker build和docker run)不同,docker-compose它只需要一个。因此,当您这样做时docker-compose up,它会查找名为的文件docker-compose.yml(docker-compose.override.yml如果存在)。
如果是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:都是不必要的,可以删除。)
| 归档时间: |
|
| 查看次数: |
7727 次 |
| 最近记录: |