Dockerfile COPY 和 RUN 在一层

sta*_*fry 8 docker

我有一个用于准备 Docker 映像的脚本。我在 Dockerfile 中有这个:

COPY my_script /
RUN bash -c "/my_script"
Run Code Online (Sandbox Code Playgroud)

my_script文件包含我不希望出现在图像中的秘密(完成后它会自行删除)。

问题是尽管被删除了文件仍然保留在图像中,因为 COPY 是一个单独的层。我需要的是 COPY 和 RUN 影响同一层。

如何复制和运行脚本以便两个操作都影响同一层?

Lin*_*nPy 9

看看多阶段

\n\n

使用多阶段构建

\n\n
\n

通过多阶段构建,您可以在 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基址,并且每个指令都开始构建的新阶段。您可以有选择地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下您不想要的所有内容。为了展示其工作原理,让\xe2\x80\x99s 调整上一节中的 Dockerfile 以使用多阶段构建。

\n
\n\n

Dockerfile:

\n\n
FROM golang:1.7.3\nWORKDIR /go/src/github.com/alexellis/href-counter/\nRUN go get -d -v golang.org/x/net/html  \nCOPY app.go .\nRUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .\n\nFROM alpine:latest  \nRUN apk --no-cache add ca-certificates\nWORKDIR /root/\nCOPY --from=0 /go/src/github.com/alexellis/href-counter/app .\nCMD ["./app"]  \n
Run Code Online (Sandbox Code Playgroud)\n


Joh*_*ica 5

从 18.09 开始,您可以docker build --secret在构建过程中使用机密信息。机密被安装到构建环境中,不会存储在最终映像中。

RUN --mount=type=secret,id=script,dst=/my_script \
    bash -c /my_script
Run Code Online (Sandbox Code Playgroud)
$ docker build --secret id=script,src=my_script.sh
Run Code Online (Sandbox Code Playgroud)

该脚本不需要删除自身。


BMi*_*tch 5

这可以通过 BuildKit 来处理:

# syntax=docker/dockerfile:experimental
FROM ...
RUN --mount=type=bind,target=/my_script,source=my_script,rw \
    bash -c "/my_script"
Run Code Online (Sandbox Code Playgroud)

然后您将使用以下命令进行构建:

DOCKER_BUILDKIT=1 docker build -t my_image .
Run Code Online (Sandbox Code Playgroud)

这听起来也像是您正在尝试将秘密注入到构建中,例如从私人 git 存储库中提取。BuildKit 还允许您指定:

# syntax=docker/dockerfile:experimental
FROM ...
RUN --mount=type=secret,target=/creds,id=cred \
    bash -c "/my_script -i /creds"
Run Code Online (Sandbox Code Playgroud)

然后您将使用以下命令进行构建:

DOCKER_BUILDKIT=1 docker build -t my_image --secret id=creds,src=./creds .
Run Code Online (Sandbox Code Playgroud)

对于这两个 BuildKit 选项, mount 命令实际上永远不会将文件添加到您的映像中。它仅使文件在该单个 RUN 步骤期间可用作绑定安装。只要该 RUN 步骤不将机密输出到映像中的另一个文件,该机密就永远不会注入到映像中。

有关 BuildKit 实验语法的更多信息,请参阅:https ://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md