我正在尝试为我们使用的Docker容器构建一个备份和恢复解决方案。

我有一个我创建的Docker基础镜像ubuntu:base,不想每次都用Docker文件重新构建它来添加文件。

我想创建一个从主机运行的脚本,并使用ubuntu:base Docker映像创建一个新容器,然后将文件复制到该容器中。

如何将文件从主机复制到容器?


当前回答

我会装载并运行带有守护程序的映像,就像这里给出的那样;

docker run -d -v /blah1/blah2:/mnt --name mntcontainer ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

then

docker exec -it mntcontainer bash

其他回答

这是对标题中这个问题“将文件从主机复制到Docker容器”的直接回答。

试试docker cp。这是最简单的方法,甚至可以在我的Mac上使用。用法:

docker cp /root/some-file.txt some-docker-container:/root

这会将主机上的目录/root中的文件some-file.txt复制到名为somedocker container的Docker容器中,并复制到目录/root。它非常接近安全复制语法。如前一篇文章所示,您可以反过来使用它。也就是说,您还可以将文件从容器复制到主机。

在你下载这篇文章之前,请输入docker cp-help。阅读文档可能非常有用,有时。。。

如果您不喜欢这种方式,并且希望在已经创建并正在运行的容器中存储数据卷,那么娱乐是您目前唯一的选择。另请参阅如何将卷添加到现有Docker容器?。

如果Dockerfile中没有将目录定义为卷,则/var/lib/docker/aufs/mnt//将起作用。但在某些情况下,容器中的目录被定义为卷。在这种情况下,aufs/mnt/*/下的内容和容器看到的内容不同。

您需要使用docker inspect检查集装箱,然后查找体积。在那里,您可以看到类似/var/lib/docker/vfs/dir/fe940b的内容。。。(id)。您需要在此处添加/修改文件,而不是在aufs/mnt/*下。

令人困惑的是,这些文件也出现在/aufs/mnt/*下。我花了很长时间才弄明白为什么这里的变化对我不起作用。

docker cp SRC_PATH CONTAINER_ID:DEST_PATH

例如,我想将我的文件xxxx/download/jenkins复制到tomcat

我开始获取容器Tomcat的id

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage

docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/

许多发现这个问题的人实际上可能会在创建Docker映像时遇到将文件复制到Docker映像中的问题(我确实这样做了)。

在这种情况下,您可以使用Dockerfile中的COPY命令来创建图像。

请参阅文档。

以下是一种相当丑陋的方法,但它确实有效。

docker run -i ubuntu /bin/bash -c 'cat > file' < file