Dockerfile 中的 FROM...AS 没有按我预期的那样工作

sli*_*aap 5 docker dockerfile

我只是在学习使用 Docker,所以请耐心等待。

我想制作一个构建在我已经构建的另一个 docker 镜像之上的 docker 镜像。在我的 dockerfile 中,我指的是基础镜像的特定版本,但为了可维护性,我只想在 dockerfile 中仅提及该版本一次。dockerfile 文档似乎向我建议我可以使用“AS”关键字将符号名称映射到特定版本标签。在下一个 COPY 指令的 --from 参数中,我应该能够使用符号名称而不是特定的 image:version 标签。

这是我的 dockerfile:

FROM base:2.0 AS my_base

WORKDIR /child2

COPY --from=my_base /base /child2
COPY . /child2

CMD ["python", "-u", "child2.py"]
Run Code Online (Sandbox Code Playgroud)

当我使用此 dockerfile 进行构建时

docker build -t child2 .
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Step 1/5 : FROM base:2.0 AS my_base
 ---> c5e2be45da55
Step 2/5 : WORKDIR /child2
 ---> Using cache
 ---> 1b5a4ad816c9
Step 3/5 : COPY --from=my_base /base /child2
invalid from flag value my_base: pull access denied for my_base, repository does not exist or may require 'docker login'
Run Code Online (Sandbox Code Playgroud)

我确实使用了“docker login”,但我再次遇到了完全相同的错误。

我是否在 dockerfile 的语法中犯了一些错误,或者我对使用 AS 关键字的假设根本不正确?

我在 Windows 10 上使用 Docker 版本 18.09.2。

atl*_*ine 13

FROM...AS多阶段构建

对于多阶段构建,您可以在 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令可以使用不同的基础,并且每个指令都开始构建的新阶段。您可以有选择地将工件从一个阶段复制到另一个阶段,在最终图像中留下您不想要的所有内容。为了展示这是如何工作的,让我们调整上一节中的 Dockerfile 以使用多阶段构建。

您的 dockerfile 只有一个阶段,使用它毫无意义,接下来是一个有效的用例:

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"]  
Run Code Online (Sandbox Code Playgroud)

在这里,builder可以将第一阶段()中构建的二进制文件复制到具有新基数(FROM alpine:latest)的第二阶段。好处是:它可以减少第二阶段的 golang 工具链设置,只需使用第一阶段的二进制文件。

  • 它只是在多阶段构建中使用,以减少最终目标图像有太多无用的东西,[官方指南](https://docs.docker.com/develop/develop-images/multistage-build/)始终是一个很好的参考猜测。 (2认同)