docker - 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 .
我正在创建master
和worker
,从同一个基础镜像开始编译源代码。有点像这个 Stackoverflow 问题中解释的内容:Docker Multi-Stage: How to split up into multiple Dockerfiles
问题
如何配置我的 docker-compose.yml 以从同一个基础镜像构建两个镜像?
解决方案
如果两个图像之间唯一不同的是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。)
推荐阅读
- python - __getitem__ 返回阻止算术运算符重载的继承数据帧访问器
- sql - 在 SQL 中使用游标迭代更新有什么好处?
- jwk - 如何将 JWK 与 spring 一起使用?
- r - 如何从另外两个准备第三个 data.frame
- laravel-8 - 如何使用 Laravel 查询生成器编写此查询?(我可以使用 Laravel eloquent 得到相同的结果。)
- firebase - 参数类型“用户?” 不能分配给参数类型“未来”
- c++ - 使另一个函数可以访问本地结构实例 (C++)
- apache-spark - 使用 spark-redis 加载数据集的问题
- node.js - Mongoose countDocuments 未按预期返回
- firebase - 后台推送通知 iOS Firebase