假设我有一组依赖于公共基础图像的图像:
- base(这只是一组公共依赖项)
FROM ubuntu:16.04
ENV FOO 1
- 儿童1
FROM mybaseimage # where mybaseimage corresponds to base
CMD ["bar1_command"]
- 儿童2
FROM mybaseimage # where mybaseimage corresponds to base
CMD ["bar2_command"]
有没有可能创建docker-compose
文件,在不运行它的情况下构建base
?假设我有以下依赖项:
version: '2'
services:
child1:
build: ./path-to-child1-dockerfile
services:
child2:
build: ./path-to-child2-dockerfile
depends_on:
- child1
我希望构建base
,即使它没有显式启动。这样的事情是否可能?或者我应该简单地使用外部Makefile来构建依赖项?
build_base:
docker build -t mybaseimage mybaseimage
build_all: build_base
docker-compose build
4条答案
按热度按时间nhn9ugyo1#
这是可能的。有一种解决方法。您已经接近了,但是您缺少显式的图像标记(因此您几乎无法在子图像上声明您从哪个图像继承)。
假设您没有构建映像。您运行
docker-compose up
。将发生以下情况:mybaseimage
。它知道如何构建mybaseimage
(你给了它一个构建路径),所以它现在将构建它,并将其标记为mybaseimage
。base
服务。base
,以便它立即退出,或者没有入口点。child1
。它知道如何构建child1
(你给了它一个构建路径),所以它现在将构建它,并将其标记为child1
。child1
服务下一个
docker-compose up
将更简单(我们已经标记了可用的图像,因此我们跳过所有构建步骤)。如果您已经有标记的图像,并希望重建:使用
docker-compose build
告诉它构建所有映像(是的,基本映像和子映像都将被重建)。t98cgbkg2#
使用Makefile。docker-compose不是为了构建图像链而设计的,它是为了运行容器而设计的。
你可能还对dobi感兴趣,这是一个构建自动化工具(如make),旨在处理docker镜像和容器。
免责声明:我是dobi的作者
o4tp2gmn3#
我建议将你的dockerfile构建为多阶段构建:
如果你的
builder
非常大,但你只需要它的几个文件,你也可以这样做:然后,在你的docker compose文件中,你可以这样做:
如果你真的希望
builder
也是你的dockerfile的一部分(例如,推送到注册表)而不运行它,你可以添加一个profiles
标签,这将为目标分配一个配置文件:这将使
builder
成为do-not-run
配置文件的一部分,这意味着:docker compose up
,它将不会运行docker compose up --profile=do-not-run
来运行它在任何情况下(无论您的
docker-compose.yml
中是否有builder
),都可以使用6gpjuf904#
对于这个问题,你不需要单独的图像-只需要使用一个环境变量:
然后对于容器1,将环境变量
PROGRAM
设置为bar1_command
。对容器2、3、...、N执行相同的操作。