Docker 强制构建父镜像

时间:2021-01-12 19:36:28

标签: docker docker-compose dockerfile

我正在运行一个包含多个图像的多服务应用程序。每个映像的环境都非常相似,因此,为了避免代码重复,使用所需的程序/配置创建/标记一个“基本”映像。然后,这个“基础”图像被用作各种“应用程序”图像的父图像。下面给出了一个(说明性的)例子:

dockerfile_base:我构建的 with docker build -f dockerfile_base -t app_base:latest .

FROM ubuntu:latest
RUN apt-get update && apt-get install -y 
    build-essentials 
    

dockerfile_1:使用 docker build -f dockerfile_1 -t app_1 .

构建
FROM app_base:latest
COPY . .
RUN make test

最后是一个示例 dockerfile_2,它再次基于“app_base”描述了一个不同的服务,并使用 docker build -f dockerfile_2 -t app_2 .

构建
FROM app_base:latest
COPY . .
RUN make deploy

通常,“基础”映像首先是手动构建的。然后,“应用程序”图像也是手动构建的。最后,服务(图像 app_1、app_2 等)使用 docker run 进行测试或使用 docker-compose 进行演示部署。

这会产生一个问题:当在尚未创建 docker 镜像的新工作区(例如新手的 PC)上工作时,或者当“dockerfile_base”中的某些内容发生变化时,只为应用运行 docker build 命令图像将导致错误或不正确的图像。所以,问题是:docker 中有没有办法定义这些链构建?我想这对于 docker build 命令来说很困难,但是 docker-compose 可以吗?

2 个答案:

答案 0 :(得分:0)

Multi-stage builds 就是为这样的问题而发明的。一个例子可能是:

FROM ubuntu:latest as app_base
RUN apt-get update && apt-get install -y build-essentials 
    
FROM app_base as app_name
COPY . .
RUN make

答案 1 :(得分:0)

好的,这就是我想出来的,它基本上只用 2 个命令简化了整个多构建多图像过程。 docker-compose.yaml 文件是这样创建的:

version: "3.4"

services:
  # dummy service used only for building the images
  dummy_app_base:
    image: app_base:latest
    build:
      dockerfile: "${PWD}/dockerfile_base"
      context: "${PWD}"
    command: [ "echo", "\"dummy_app_base:latest EXIT\"" ]

  app_1:
    image: app_1:latest
    build:
      dockerfile: "${PWD}/dockerfile_1"
      context: "${PWD}"

  app_2:
    image: app_2:latest
    build:
      dockerfile: "${PWD}/dockerfile_2"
      context: "${PWD}"

因此,要构建所有图像,我只需运行 docker-compose build。 build 命令本质上是按照它们在 docker-compose.yaml 文件中出现的顺序构建和标记所有图像,因此在构建 app_1 和 app_2 时,已经构建了依赖项 app_base:latest。然后,使用 docker-compose up 运行所有内容。注意:这将为 dummy_app_base 服务创建一个悬空容器,但用回声覆盖其命令,它将立即退出。

编辑:即使在一个命令中:docker-compose up --build