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