您可以按照您描述的方式拆分事物;在单个 Dockerfile 中分两个阶段执行操作,或者使用主机工具执行构建的主要部分可能会更健壮。
这有两个重要部分。第一个是,在您的docker-compose.yml
文件中,如果您同时指定build:
描述和image:
名称,那么Docker Compose 将为您标记构建的映像。第二个是DockerfileCOPY
指令可以复制--from
先前构建阶段的内容或从任意其他映像复制内容。所以如果你docker-compose.yml
说
version: '3'
services:
service1:
build: ./service1-dir
image: me/service1
service2:
build: ./service2-dir
并service2-dir/Dockerfile
说
COPY --from=me/service1 /app/somefile .
它会将内容从一个图像复制到另一个图像。
这里的一个挑战是docker-compose build
没有指定图像的构建顺序。如果它首先构建 service2,它将从 service1 的先前构建中获取旧内容(或者如果它是初始构建则失败)。为了可靠地做到这一点,你需要做类似的事情
docker-compose build service1
docker-compose build
docker-compose up -d
如果构建顺序不是太复杂,只需将它包含在两个 Dockerfile 中就可以了。它还可以在主机上构建您需要的任何工件,并让您的 Dockerfiles 按原样复制它,而不是自己构建它;如果该内容是平台中立的(Java.jar
文件、来自 Webpack 构建的浏览器应用程序的 HTML/Javascript/CSS 文件),这尤其适用。