我构建了以下图像,docker build -t mylambda .
我现在尝试lambdatest.zip在构建它时导出到我的本地主机,所以我在我的桌面上看到了 .zip 文件。到目前为止,我使用过,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 *
Run Code Online (Sandbox Code Playgroud)
Dockerfile(更新):
FROM lambci/lambda:build-python3.7
RUN python3 -m venv venv
RUN . venv/bin/activate
RUN pip install --upgrade pip
RUN pip install pystan==2.18
RUN pip install fbprophet
WORKDIR /var/task/venv/lib/python3.7/site-packages
COPY lambda_function.py .
COPY .lambdaignore .
RUN echo "Package size: $(du -sh | cut -f1)"
RUN zip -9qr lambdatest.zip *
RUN cat .lambdaignore | xargs zip -9qr /var/task/lambdatest.zip * -x
Run Code Online (Sandbox Code Playgroud)
Rem*_*i D 17
从 docker 18.09 开始,它原生支持名为 BuildKit 的自定义后端:
DOCKER_BUILDKIT=1 docker build -o target/folder myimage
Run Code Online (Sandbox Code Playgroud)
这允许您将最新阶段复制到target/folder. 如果您只需要特定文件而不是整个文件系统,您可以在构建中添加一个阶段:
FROM XXX as builder-stage
# Your existing dockerfile stages
FROM scratch
COPY --from=builder-stage /file/to/export /
Run Code Online (Sandbox Code Playgroud)
注意:您的 docker 客户端和引擎需要与 Docker Engine API 1.40+ 兼容,否则 docker 将无法理解该-o标志。
参考:https ://docs.docker.com/engine/reference/commandline/build/#custom-build-outputs
典型的答案是你没有。按照设计,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
Run Code Online (Sandbox Code Playgroud)
或者它可能涉及 I/O 管道,您可以在容器内运行 tar 命令来打包文件,并将其通过管道传输到主机上运行的 tar 命令以保存文件。
docker build -t your_image
docker run --rm your_image tar -cC /path/in/container . | tar -xC /path/on/host
Run Code Online (Sandbox Code Playgroud)
最近,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
Run Code Online (Sandbox Code Playgroud)
然后用于提取 zip 文件的构建命令如下所示:
docker buildx build --target=artifact --output type=local,dest=$(pwd)/out/ .
Run Code Online (Sandbox Code Playgroud)
我相信 buildx 在最新版本中仍被标记为实验性的,因此要启用它,您至少需要以下 json 条目$HOME/.docker/config.json:
{ "experimental": "enabled" }
Run Code Online (Sandbox Code Playgroud)
然后对于所有 buildx 功能,您将需要使用docker buildx create.
使用最新版本的 docker CLI,与 buildkit 的集成提供了更多选项。现在不再需要运行 buildx 来访问输出标志。这意味着上述更改为:
docker build --target=artifact --output type=local,dest=$(pwd)/out/ .
Run Code Online (Sandbox Code Playgroud)
如果 buildkit 尚未在您的版本上启用(在 20.10 中应该默认启用),您可以在您的 shell 中启用它:
export DOCKER_BUILDKIT=1
Run Code Online (Sandbox Code Playgroud)
或者对于整个主机,您可以使用以下内容将其设为默认值/etc/docker/daemon.json:
{
"features": {"buildkit": true }
}
Run Code Online (Sandbox Code Playgroud)
并且要使用daemon.jsondocker 引擎需要重新加载:
systemctl reload docker
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7241 次 |
| 最近记录: |