0

假设我们docker-compose.yml在不同的位置使用 Dockerfile 构建了一些服务,如下所示:

version: '3.4'

services:
  service1:
    build: ./service1-dir

  service2:
    build: ./service2-dir

假设在 service1 的 Dockerfile 中,我们已经复制了一些文件夹。我可以将此文件夹传递给 service2 的 docker 文件吗?

换句话说 - 我可以使用多阶段构建技术在不同的 Dockerfile 之间传递层,还是多阶段构建应该只在一个 Dockerfile 中?

4

1 回答 1

0

可以按照您描述的方式拆分事物;在单个 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 文件),这尤其适用。

于 2019-12-24T01:38:39.163 回答