gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:35:28 27 4
gpt4 key购买 nike

我使用 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 *

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

最佳答案

典型的答案是你不知道。根据设计,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 创建一个非默认构建器。

<小时/>

在最新版本的 docker CLI 中,与 buildkit 的集成提供了更多选项。现在不再需要运行 buildx 来访问输出标志。这意味着上述更改为:

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

如果您的版本尚未启用 buildkit(在 20.10 中应默认启用),您可以使用以下命令在 shell 中启用它:

export DOCKER_BUILDKIT=1

或者对于整个主机,您可以在 /etc/docker/daemon.json 中使用以下内容将其设置为默认值:

{
"features": {"buildkit": true }
}

要使用daemon.json,需要重新加载 docker 引擎:

systemctl reload docker

关于Docker:在构建容器时将文件复制出容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339971/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com