我只是在学习使用 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 工具链设置,只需使用第一阶段的二进制文件。
| 归档时间: |
|
| 查看次数: |
7141 次 |
| 最近记录: |