如何从Docker容器中检索文件?

时间:2019-06-27 18:52:24

标签: docker dockerfile

我有一个简单的Dockerfile,它创建一个zip文件,一旦准备好,我就尝试检索该zip文件。我的Dockerfile看起来像这样:

FROM ubuntu

RUN apt-get update && apt-get install -y build-essentials gcc

ENTRYPOINT ["zip","-r","-9"]
CMD ["/lib64.zip", "/lib64"]

在阅读了文档之后,我觉得类似的事情应该可以做到,但我不能完全使它起作用。

docker build -t ubuntu-libs .
docker run -d --name ubuntu-libs --mount source=$(pwd)/,target=/lib64.zip ubuntu-libs

另一个问题:是否可以从命令行重命名zip文件?

编辑:

这与注释中提到的duplicate question不同,因为当他们使用cp从正在运行的Docker容器中复制文件时,我试图在实例化时挂载目录。

2 个答案:

答案 0 :(得分:3)

有多种方法可以做到这一点。

使用docker cp:

docker cp <container_hash>:/path/to/zip/file.zip /path/on/host/new_name.zip

使用docker卷:

正如您所提出的那样,您还可以安装从容器到主机的路径。您可以通过指定希望挂载点在主机上的位置来执行此操作,也可以不指定挂载点在何处,而是让docker选择。这两种路径都需要不同的方法。

让docker选择主机安装位置

docker volume create random_volume_name
docker run -d --name ubuntu-libs -v random_volume_name:<path/to/mount/in/container> ubuntu-libs

内容将在您的主机上,位于:

ls -l /var/lib/docker/volumes/random_volume_name/_data/ 

让我选择主机的安装位置

docker run -d --name ubuntu-libs -v <existing/mount/point/on/host>:<path/to/mount/in/container> ubuntu-libs

这将创建一个干净/空的位置,该位置根据命令中定义的位置共享。现在,您需要修改Dockerfile以将工件复制到此路径,例如:

FROM ubuntu

RUN apt-get update && apt-get install -y build-essentials gcc

ENTRYPOINT ["zip","-r","-9"]
CMD ["sh", "-c", "/lib64.zip", "/lib64", "cp", "path/to/zip/file.zip", "<path/to/mount/in/container>"]

内容现在将位于您的主机上,这里:

ls -l <existing/mount/point/on/host>

我得向here的@joaofnfernandes欢呼,他的解释很好。

答案 1 :(得分:1)

正如@ flagg19所评论的那样,您应该将目录绑定到目录上。您可以在容器内组成目录,并且可以覆盖RUN参数。同时执行并添加type=bind会带来巨大的成功:

docker run -d --rm --mount type=bind,source="$(pwd)",target=/out ubuntu-libs /out/lib64.zip /lib64

或者当然,您可以更改Dockerfile RUN命令以写入/out/lib64.zip而不是/lib64.zip

FROM ubuntu

RUN apt-get update && apt-get install -y build-essentials gcc && mkdir /out

ENTRYPOINT ["zip","-r","-9"]
CMD ["/out/lib64.zip", "/lib64"]
docker run -d --rm --mount type=bind,source="$(pwd)",target=/out ubuntu-libs

无论哪种方式,我都建议添加--rm并摆脱--name。完成后,无需在容器附近闲逛。

相关问题