假设我有一组依赖于共同基本图像的图像:
base(这只是一组常见的依赖项)
FROM ubuntu:16.04
ENV FOO 1
child1
FROM mybaseimage # where mybaseimage corresponds to base
CMD ["bar1_command"]
的child2
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
答案 0 :(得分:10)
使用Makefile。 docker-compose不是为构建图像链而设计的,它专为运行容器而设计。
您可能也对dobi感兴趣,https://storage.googleapis.com/bucket_name/pictureName是一个构建自动化工具(如make),旨在使用docker镜像和容器。
免责声明:我是 dobi
的作者答案 1 :(得分:10)
这是可能的。有一种解决方法。您已经关闭,但是您缺少显式图片标记(因此您无法在子图像上声明您继承的图像)。
version: '3.2'
services:
base:
image: mybaseimage
build: ./path-to-base-dockerfile
child1:
build: ./path-to-child1-dockerfile
depends_on:
- base
child2:
build: ./path-to-child2-dockerfile
depends_on:
- base
我们假设您没有构建图像。您运行docker-compose up
。将发生以下情况:
mybaseimage
。它知道如何构建mybaseimage
(你给它一个构建路径),所以它现在将构建它,并将其标记为mybaseimage
。base
服务。
base
以便它立即退出,或者没有入口点。因为我们实际上 希望它运行此服务。child1
。它知道如何构建child1
(你给它一个构建路径),所以它现在将构建它,并将其标记为child1
。child1
服务下一个docker-compose up
将更简单(我们已标记图像可用,因此我们跳过所有构建步骤。)
如果您已经有标记图像,并且想要重建:使用docker-compose build
告诉它构建所有图像(是的,基础和子项都将被重建)。
答案 2 :(得分:0)
对于此问题,您不需要单独的图像-只需使用环境变量即可:
FROM ubuntu:16.04
ENV PROGRAM
CMD ${PROGRAM}
然后对于容器1,将环境变量PROGRAM
设置为bar1_command
。对容器2、3,...,N进行相同操作。