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

f5e*_*05f 19 docker dockerfile docker-compose

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

是否可以创建无需运行即可docker-compose构建的文件base?让我们说我有以下依赖:

version: '2'
services:
    child1:
        build: ./path-to-child1-dockerfile
services:
    child2:
        build: ./path-to-child2-dockerfile
    depends_on:
        - child1
Run Code Online (Sandbox Code Playgroud)

base即使没有明确启动,我也想构建.这样的事情甚至可能吗?或者我应该只使用外部Makefile来构建依赖项?

build_base:
    docker build -t mybaseimage mybaseimage  

build_all: build_base
    docker-compose build
Run Code Online (Sandbox Code Playgroud)

Bir*_*abs 14

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

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
Run Code Online (Sandbox Code Playgroud)

假设您没有构建图像.你跑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告诉它构建所有图像(是的,基础和子项都将被重建).


dne*_*hin 9

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

您可能还对dobi感兴趣,这是一个构建自动化工具(如make),旨在与docker图像和容器一起使用.

免责声明:我是dobi的作者