【问题标题】:Docker multistage: how to COPY built files between stages?Docker 多阶段:如何在阶段之间复制构建的文件?
【发布时间】:2020-01-14 13:31:32
【问题描述】:

我是 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 实际上是为了从启动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"]

当我从包含 Dockerfile 的目录运行 docker build . 时,构建结束的方式如下:

Step 5/11 : RUN pwd; echo "---"; ls
 ---> Running in 28ff49fe9150
/bioinfo_utils/remove-duplicates-from-sorted-fastq/Haskell
---
LICENSE
Setup.hs
install.sh
remove-duplicates-from-sorted-fastq
remove-duplicates-from-sorted-fastq.cabal
src
stack.yaml
 ---> f551efc6bba2
Removing intermediate container 28ff49fe9150
Step 6/11 : COPY remove-duplicates-from-sorted-fastq .
lstat remove-duplicates-from-sorted-fastq: no such file or directory

我应该如何继续使构建的文件可用于下一阶段?

【问题讨论】:

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


    【解决方案1】:

    好吧,显然,我被文档示例中第一阶段使用的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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-25
      • 2019-04-16
      • 2020-12-15
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多