Docker 将文件从主机复制到容器

9

我想把一组文件从Docker主机复制到容器中。 在 AUFS 系统中,直接进入 /var/lib/docker/aufs/... 即可正常工作。 但是,在另一个使用 devicemapper 作为存储驱动的 Fedora 系统上,如果我这样做:

[root@myhost tmp]# docker inspect -f '{{.Id}}' 393ef4b9f485
393ef4b9f485dafc78037f59bdbeda16d63b8338487248ed25b68cf544f29e24
[root@myhost tmp]# cd /var/lib/docker/devicemapper/mnt/393ef4b9f485dafc78037f59bdbeda16d63b8338487248ed25b68cf544f29e24
[root@myhost 393ef4b9f485dafc78037f59bdbeda16d63b8338487248ed25b68cf544f29e24]# ls -l
total 0
[root@myhost 393ef4b9f485dafc78037f59bdbeda16d63b8338487248ed25b68cf544f29e24]#

我什么也没得到。我尝试了从主机复制文件到Docker容器的所有建议。
使用tar似乎很好,而不是直接进入底层FS。但我不能假设所有容器都有tar。
如果相关,我甚至尝试在容器中创建一个文件,但在/var/lib/docker/devicemapper/mnt中执行find . -name时没有发现它。
有什么提示吗?
编辑1: 基于其中一个答案,添加这些约束条件。 目的是将文件复制到容器中,而不会a.修改容器构建(Dockerfile),b.安装任何ssh或ftp守护程序。和c.甚至不改变容器启动的方式。
编辑2:添加docker信息 :
# docker info
Containers: 1
Images: 21
Storage Driver: devicemapper
 Pool Name: docker-253:0-397467-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file:
 Metadata file:
 Data Space Used: 4.261 GB
 Data Space Total: 107.4 GB
 Data Space Available: 103.1 GB
 Metadata Space Used: 3.596 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.144 GB
 Udev Sync Supported: true
 Library Version: 1.02.90 (2014-09-01)
Execution Driver: native-0.2
Kernel Version: 3.17.4-301.fc21.x86_64
Operating System: Fedora 21 (Twenty One)
CPUs: 4
Total Memory: 3.86 GiB
Name: fedora-docker

您好, Docker 版本是 1.6.0,容器镜像基于 RHEL。


1
为什么你需要这样做?因为没有官方支持的解决方案,所以任何答案都只能是一个hack - 但如果你告诉我们你为什么需要这个,也许我们可以想出一些东西。 - Adrian Mouat
虽然官方并未提供支持,但实际上 Docker 1.7 应该会有这个变化,https://github.com/docker/docker/pull/10198,但是对于我的用例,我需要在已经运行的容器内进行一些检查,因此我需要推入一些脚本和文件并获取它们的输出,而不需要“干扰”或重建容器。 - Yogesh_D
如果您可以假设脚本将运行,那么您可能可以假设至少存在cat和可能的tar。如果您无法将此脚本添加到图像中,则可以在运行时将其挂载为卷。 - Adrian Mouat
你所说的“脚本”,是指二进制文件吗?否则,你怎么知道你需要的 shell 是否存在? - Adrian Mouat
关于 shell 的好处,我需要的文件是一些二进制文件和几个支持配置文件以及一个执行脚本。到目前为止,在某些容器上,我没有遇到过 shell 的问题,但是我遇到了 tar 不存在的问题。我可以像链接中描述的那样使用 cat,但这意味着我需要为每个需要放置的文件执行 docker exec。 - Yogesh_D
好的。有趣的讨论。祝你好运,但我怀疑没有人会提出更好的答案。就我个人而言,我不太喜欢打破容器并运行脚本的整个想法 :) - Adrian Mouat
2个回答

10

更新: 现在docker cp命令行指令可以双向工作。 请查阅docker cp文档。

用法

docker cp [选项] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [选项] SRC_PATH|- CONTAINER:DEST_PATH

=======原始回答 ==============

发现最简单的适用于所有存储驱动程序的方法:

cd /proc/`docker inspect --format "{{.State.Pid}}" <containerid>`/root

我已经在使用Devicemapper作为存储驱动程序的Fedora和使用AUFS作为存储驱动程序的Ubuntu上对此进行了测试。在这两种情况下都对我有效。


在Ubuntu 14.04和docker 1.6.2上工作得非常顺利(我神秘地补充说:恰好是在最后时刻)。 - hauron

0

这个答案提供了另一种复制的视角。

1> 如果您知道容器的IP,则可以使用此方法。如果您的目的只是将文件从主机系统复制到容器中,可以使用不同的方法。文件传输协议是一种更简单的方式。您可以在docker容器上设置一个SSH服务器(sshd),然后使用scp或任何其他文件传输工具进行复制。

2> 使用以下命令通过卷共享文件:docker run -ti -v /host-path-of-directory-having-files/:/target-path-in-container/:rw image-name bash。您可以参考此链接https://docs.docker.com/userguide/dockervolumes/


请查看问题的编辑,我无法更改容器的启动方式或在容器中安装新软件。 - Yogesh_D
你在Docker中使用哪个镜像?你使用的Docker基础镜像操作系统和主机操作系统是什么? - Tejus Prasad
Docker镜像基于RHEL,主机操作系统为Fedora 21版本,Docker版本为1.6.0,并且Docker信息显示存储驱动程序为devicemapper。请查看完整的Docker信息并编辑问题。 - Yogesh_D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接