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

Par*_*ner 4 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"]
Run Code Online (Sandbox Code Playgroud)

阅读完文档后,我觉得这样的事情应该可以做到,但我无法让它发挥作用。

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

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

编辑:

这与评论中提到的重复问题不同,因为当他们使用cp从正在运行的 Docker 容器复制文件时,我试图在实例化时挂载一个目录。

Per*_*bot 5

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

使用 docker cp:

docker cp <container_hash>:/path/to/zip/file.zip /path/on/host/new_name.zip
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

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

ls -l /var/lib/docker/volumes/random_volume_name/_data/ 
Run Code Online (Sandbox Code Playgroud)

让我选择主机挂载位置

docker run -d --name ubuntu-libs -v <existing/mount/point/on/host>:<path/to/mount/in/container> ubuntu-libs
Run Code Online (Sandbox Code Playgroud)

这将创建一个干净/空的位置,根据命令中定义的位置共享该位置。现在您需要修改 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>"]
Run Code Online (Sandbox Code Playgroud)

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

ls -l <existing/mount/point/on/host>
Run Code Online (Sandbox Code Playgroud)

我必须从这里向 @joaofnfernandes 大喊大叫,他在解释方面做得很好。