我使用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 *
答案 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
标志。