首页 > 解决方案 > Docker Compose:如何配置拆分为多个 Dockerfile 的多阶段 Docker 映像?

问题描述

我有 3 个 Dockerfile

./Dockerfile

FROM rust:1.43.1
WORKDIR /usr/src/hiro
COPY . .
RUN cargo build

./Dockerfile.master

FROM me/base
RUN chmod +x ./target/debug/hiro
CMD [ "./target/debug/hiro", "--master", "-p", "${PORT}" ]

./Dockerfile.worker

FROM me/base
RUN chmod +x ./target/debug/hiro
CMD [ "./target/debug/hiro", "--worker", "-p", "${PORT}" ]

构建(没有 Docker Compose)

docker build -t me/base -f Dockerfile .

接着,

docker build -t me/master -f Dockerfile.master .
docker build -t me/worker -f Dockerfile.worker .

我正在创建masterworker,从同一个基础镜像开始编译源代码。有点像这个 Stackoverflow 问题中解释的内容:Docker Multi-Stage: How to split up into multiple Dockerfiles

问题

如何配置我的 docker-compose.yml 以从同一个基础镜像构建两个镜像?

标签: dockerdocker-composedockerfile

解决方案


如果两个图像之间唯一不同的是CMD,那很容易在docker-compose.yml.

version: '3.8'
services:
  master:
    build: . # uses the base Dockerfile
    command: ./target/debug/hiro --master --port 12345
  worker:
    build: .
    command: ./target/debug/hiro --worker --port 12345

以这种方式易于定制的另一件事是每次调用的环境变量。但是请注意,这不会通过不同的变量来重建图像。它只会在CMD不同的环境下启动决赛。

您的问题显示了简单的docker build命令;图像docker run名称后的任何内容都被类似地解释为要运行的命令。

docker run ... me/base \
  ./target/debug/hiro --worker --port 12345

(如果您正在寻找其他示例,这在 Python Django/Celery 应用程序中尤其常见。“主”应用程序是基于 Django 的 Web 服务器,但它与 Celery 任务运行程序共享其大部分源代码树,并且您使用相同的图像但不同的命令启动 Celery worker。)


推荐阅读