Docker:在构建文件时将其复制出容器

时间:2019-08-03 16:02:31

标签: docker

我使用public构建以下图像 现在,我在构建docker build -t mylambda .时将其导出到我的本地主机,以便在桌面上看到.zip文件。到目前为止,我使用了lambdatest.zip,但这在我的Dockerfile(?)中不起作用。你有什么想法吗?

docker cp <Container ID>:/var/task/lambdatest.zip ~/Desktop

Dockerfile(已更新):

FROM lambci/lambda:build-python3.7
COPY lambda_function.py .

RUN python3 -m venv venv
RUN . venv/bin/activate

# ZIP
RUN pushd /var/task/venv/lib/python3.7/site-packages/
# Execute "zip" in bash for explanation of -9qr
RUN zip -9qr /var/task/lambdatest.zip *

2 个答案:

答案 0 :(得分:1)

典型的答案是你不这样做。根据设计,Dockerfile无权将文件写出到主机,就像它无权从构建上下文外部读取任意文件一样。造成这种情况的原因有多种,其中包括安全性(您不希望映像构建在云中的构建主机上放置后门)和可重复性(映像不应在上下文之外具有依赖性)。

因此,您需要采取额外的步骤将图像的上下文提取回主机。通常,这涉及创建一个运行docker cp命令的容器,如下所示:

docker build -t your_image .
docker create --name extract your_image
docker cp extract:/path/to/files /path/on/host
docker rm extract

或者它可能涉及I / O管道,您可以在容器内运行tar命令以打包文件,然后将其管道传输到主机上运行的tar命令以保存文件。

docker build -t your_image
docker run --rm your_image tar -cC /path/in/container . | tar -xC /path/on/host

最近,Docker一直在研究buildx,该实验目前处于试验阶段。使用该功能,您可以创建一个阶段,该阶段由要导出到主机的文件组成,并使用--output选项将该阶段写入主机,而不是映像。然后,您的Dockerfile会像这样:

FROM lambci/lambda:build-python3.7 as build
COPY lambda_function.py .

RUN python3 -m venv venv
RUN . venv/bin/activate

# ZIP
RUN pushd /var/task/venv/lib/python3.7/site-packages/
# Execute "zip" in bash for explanation of -9qr
RUN zip -9qr /var/task/lambdatest.zip *

FROM scratch as artifact
COPY --from=build /var/task/lambdatest.zip /lambdatest.zip

FROM build as release

然后提取zip文件的构建命令如下:

docker buildx build --target=artifact --output type=local,dest=$(pwd)/out/ .

我相信buildx在最新版本中仍被标记为实验性的,因此要启用该功能,您至少需要在$HOME/.docker/config.json中包含以下json条目:

{ "experimental": "enabled" }

然后,对于所有buildx功能,您将要使用docker buildx create创建一个非默认的构建器。

答案 1 :(得分:0)

自docker docker 18.09起,docker本地支持名为BuildKit的自定义后端:

DOCKER_BUILDKIT=1 docker build -o target/folder myimage

这使您可以将最新阶段复制到target/folder。如果只需要特定文件而不是整个文件系统,则可以在构建中添加一个阶段:

FROM XXX as builder-stage
# Your existing dockerfile stages

FROM scratch
COPY --from=builder-stage /file/to/export /

注意:您将需要docker客户端和引擎与Docker Engine API 1.40+兼容,否则docker将无法理解-o标志。