使用docker-compose构建公共依赖项

时间:2016-06-20 23:10:08

标签: docker docker-compose dockerfile

假设我有一组依赖于共同基本图像的图像:

  • 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

3 个答案:

答案 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。将发生以下情况:

  • docker-compose看到child1和child2服务依赖于base。所以它将首先部署基地。
  • docker-compose发现您尚未将任何图片标记为mybaseimage。它知道如何构建mybaseimage(你给它一个构建路径),所以它现在将构建它,并将其标记为mybaseimage
  • docker-compose部署base服务。
    • 理想情况下,您应该设计base以便它立即退出,或者没有入口点。因为我们实际上 希望它运行此服务。
  • docker-compose考虑部署child1和child2
  • docker-compose发现您尚未将任何图片标记为child1。它知道如何构建child1(你给它一个构建路径),所以它现在将构建它,并将其标记为child1
  • docker-compose部署child1服务
  • child2的相同步骤

下一个docker-compose up将更简单(我们已标记图像可用,因此我们跳过所有构建步骤。)

如果您已经有标记图像,并且想要重建:使用docker-compose build告诉它构建所有图像(是的,基础和子项都将被重建)。

答案 2 :(得分:0)

对于此问题,您不需要单独的图像-只需使用环境变量即可:

FROM ubuntu:16.04

ENV PROGRAM

CMD ${PROGRAM}

然后对于容器1,将环境变量PROGRAM设置为bar1_command。对容器2、3,...,N进行相同操作。