Docker将文件从主机复制到容器
Posted
技术标签:
【中文标题】Docker将文件从主机复制到容器【英文标题】:Docker Copying file from host to container 【发布时间】:2015-07-08 11:37:25 【问题描述】:我正在尝试将一组文件从 docker 主机复制到容器。 在直接进入 /var/lib/docker/aufs/... 的 AUFS 系统上有效。 但是,我是另一个使用设备映射器作为存储驱动程序的 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]#
我什么也得不到。 我已经尝试了Copying files from host to Docker container的所有建议
使用 tar 似乎很棒,而不是直接进入底层 FS。但我不能假设 tar 会出现在所有容器中。
如果它是相关的,我什至尝试在容器中创建一个文件,但它然后做了一个 find 。 -name in /var/lib/docker/devicemapper/mnt 无效。
有什么提示吗?
编辑 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。
【问题讨论】:
为什么需要这样做?没有官方支持的解决方案,所以任何答案都将是一个 hack - 但如果你告诉我们你为什么需要这个,也许我们可以想出一些东西。 同意没有对此的官方支持,实际上 Docker 1.7 应该得到这个改变,github.com/docker/docker/pull/10198,但是对于我的用例,我需要在一个已经运行的容器中做一些检查我需要推入一些脚本和文件并获得它们的输出。没有“干扰”/重建容器。 如果你可以假设脚本会运行,我想你可以假设至少 cat 存在,并且可能是 tar。如果您无法将此脚本添加到您的映像中,您可以在运行时将其挂载为卷。 通过脚本,你的意思是二进制吗?否则你怎么知道你需要的 shell 存在? shell 的好点,我需要的文件是一些二进制文件和一些支持配置文件和一个执行脚本。到目前为止,在某些容器上,我没有遇到 shell 问题,但我遇到了 tar 不存在。好吧,我可以按照链接问题中的描述使用 cat ,但这意味着为我需要放入的每个文件执行 docker exec。 【参考方案1】:更新: 现在 docker cp 命令行命令可以双向工作。 请参阅docker cp 文档
用法
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
=======原始答案===============
找到跨存储驱动程序工作的最简单方法:
cd /proc/`docker inspect --format ".State.Pid" <containerid>`/root
已在 Fedora 上使用 Devicemapper 作为存储驱动程序对此进行了测试 在 Ubuntu 上使用 AUFS 作为存储驱动程序。 在这两种情况下都对我有用。
【讨论】:
像魅力一样在 Ubuntu 14.04 和 docker 1.6.2 上工作(我会神秘地添加:及时)。【参考方案2】:此答案为您提供了不同的复制视图。
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/
【讨论】:
请查看问题的编辑,我无法更改容器的启动方式,也无法在容器中安装新软件。 在 docker 中使用了哪个镜像??哪个 docker 基础镜像操作系统,主机操作系统 ru 使用 ?? Docker 镜像基于 RHEL,Host OS Fedora release 21,Docker 版本 1.6.0,Docker Info 声明存储驱动是 devicemapper。查看完整的 docker 信息和问题的编辑。以上是关于Docker将文件从主机复制到容器的主要内容,如果未能解决你的问题,请参考以下文章
docker cp:从容器复制文件到宿主机,从宿主机复制文件到容器