Docker多阶段:如何在阶段之间复制构建的文件?

时间:2019-09-12 16:04:36

标签: docker dockerfile docker-multi-stage-build docker-copy

我是Docker的初学者,我试图分两个阶段构建映像,如此处所述:https://docs.docker.com/develop/develop-images/multistage-build/

  

您可以有选择地将工件从一个阶段复制到另一个阶段

查看那里给出的示例,我以为一个人可以在第一阶段构建一些文件,然后将它们提供给下一个文件:

FROM golang:1.7.3 AS builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]  

(摘自上面链接的页面的示例)

不是COPY app.go .COPY --from=builder /go/src/github.com/alexellis/href-counter/app .应该做什么?

我可能对发生的事情有完全的误解,因为当我尝试做类似的事情(见下文)时,似乎第一阶段的COPY命令无法看到刚刚构建(我可以使用RUN ls步骤来确认它们实际上是构建的,但随后出现lstat <the file>: no such file or directory错误)。

实际上,我可以收集的关于COPY的大多数其他信息(上述链接中的示例除外)而是建议COPY实际上是要从{{1} }命令启动,而不是从构建环境内部启动。

这是我的Dockerfile:

docker build

这是当我从包含Dockerfile的目录中运行FROM haskell:8.6.5 as haskell RUN git clone https://gitlab+deploy-token-75:sakyTxfe-PxPHDwqsoGm@gitlab.pasteur.fr/bli/bioinfo_utils.git WORKDIR bioinfo_utils/remove-duplicates-from-sorted-fastq/Haskell RUN stack --resolver ghc-8.6.5 build && \ stack --resolver ghc-8.6.5 install --local-bin-path . RUN pwd; echo "---"; ls COPY remove-duplicates-from-sorted-fastq . FROM python:3.7-buster RUN python3.7 -m pip install snakemake RUN mkdir -p /opt/bin COPY --from=haskell /bioinfo_utils/remove-duplicates-from-sorted-fastq/Haskell/remove-duplicates-from-sorted-fastq /opt/bin/remove-duplicates-from-sorted-fastq CMD ["/bin/bash"] 时构建结束的方式:

docker build .

我应该如何继续将生成的文件用于下一阶段?

1 个答案:

答案 0 :(得分:0)

很显然,我被doc示例的第一阶段中使用的COPY步骤误导了。就我而言,这实际上是没有用的,我在第二阶段只能COPY --from=haskell,而在第一阶段则不需要任何COPY

以下Dockerfile构建没有问题:

FROM haskell:8.6.5 as haskell
RUN git clone https://gitlab+deploy-token-75:sakyTxfe-PxPHDwqsoGm@gitlab.pasteur.fr/bli/bioinfo_utils.git
WORKDIR bioinfo_utils/remove-duplicates-from-sorted-fastq/Haskell
RUN stack --resolver ghc-8.6.5 build && \
    stack --resolver ghc-8.6.5 install --local-bin-path .

FROM python:3.7-buster
RUN python3.7 -m pip install snakemake
RUN mkdir -p /opt/bin
COPY --from=haskell /bioinfo_utils/remove-duplicates-from-sorted-fastq/Haskell/remove-duplicates-from-sorted-fastq /opt/bin/remove-duplicates-from-sorted-fastq
CMD ["/bin/bash"]