我有一个简单的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容器中复制文件时,我试图在实例化时挂载目录。
答案 0 :(得分:3)
有多种方法可以做到这一点。
docker cp <container_hash>:/path/to/zip/file.zip /path/on/host/new_name.zip
正如您所提出的那样,您还可以安装从容器到主机的路径。您可以通过指定希望挂载点在主机上的位置来执行此操作,也可以不指定挂载点在何处,而是让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
。完成后,无需在容器附近闲逛。