Docker 多阶段:如何在阶段之间复制构建的文件?
Docker multistage: how to COPY built files between stages?
我是 Docker 的新手,我正在尝试分两个阶段构建图像,如下所述:https://docs.docker.com/develop/develop-images/multistage-build/
You can selectively copy artifacts from one stage to another
看着那里给出的示例,我原以为可以在第一阶段构建一些文件,然后让它们可用于下一阶段:
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"]
(示例取自上面的 linked 页面)
这不是 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
的大多数其他信息(除了上面 link 中的示例)更像是表明 COPY
实际上是为了从目录中复制文件docker build
命令的启动位置,而不是从构建环境中启动的位置。
这是我的Docker文件:
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 文件的目录 运行 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
我应该如何继续为下一阶段提供可用的构建文件?
嗯,显然,我被文档示例中第一阶段使用的 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"]
我是 Docker 的新手,我正在尝试分两个阶段构建图像,如下所述:https://docs.docker.com/develop/develop-images/multistage-build/
You can selectively copy artifacts from one stage to another
看着那里给出的示例,我原以为可以在第一阶段构建一些文件,然后让它们可用于下一阶段:
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"]
(示例取自上面的 linked 页面)
这不是 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
的大多数其他信息(除了上面 link 中的示例)更像是表明 COPY
实际上是为了从目录中复制文件docker build
命令的启动位置,而不是从构建环境中启动的位置。
这是我的Docker文件:
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 文件的目录 运行 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
我应该如何继续为下一阶段提供可用的构建文件?
嗯,显然,我被文档示例中第一阶段使用的 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"]