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


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

  • 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

11647
2018-06-20 23:10


起源



答案:


使用Makefile。 docker-compose不是为构建图像链而设计的,它是为运行容器而设计的。

你也可能对此有兴趣 DOBI 这是一个构建自动化工具(如make),用于处理docker镜像和容器。

免责声明:我是作者 DOBI


8
2018-06-21 13:12





这是可能的。有一种解决方法。你很接近,但是你错过了明确的图像标签(因此你很难在子图像上声明你继承了哪个图像)。

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 告诉它建立所有图像(是的,基础和孩子都将被重建)。


5
2017-07-05 10:30