Docker-撰写多阶段构建?

时间:2019-12-23 18:49:59

标签: docker docker-compose docker-multi-stage-build

比方说,我们有docker-compose.yml可以在这样的不同位置使用Dockerfile构建很少的服务:

version: '3.4'

services:
  service1:
    build: ./service1-dir

  service2:
    build: ./service2-dir

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

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

1 个答案:

答案 0 :(得分:0)

可以按照您的描述方式拆分事物;在单个Dockerfile中分两个阶段进行操作,或者使用宿主工具进行构建的主要部分,可能会更健壮。

有两个基本部分。首先是,在您的docker-compose.yml文件中,如果同时指定了build:描述和image:名称,则将Docker Compose will tag the built image for you指定。第二个是Dockerfile COPY directive可以在先前的构建阶段或从任意其他映像复制内容--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文件),则此方法特别有用。