比方说,我们有docker-compose.yml
可以在这样的不同位置使用Dockerfile构建很少的服务:
version: '3.4'
services:
service1:
build: ./service1-dir
service2:
build: ./service2-dir
比方说,在service1的Dockerfile中,我们已经复制了一些文件夹。 我可以将此文件夹传递到service2的docker文件吗?
换句话说-我可以使用多阶段构建技术在不同的Dockerfile之间传递层吗?多阶段构建应该仅在一个Dockerfile中吗?
答案 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文件),则此方法特别有用。