我正在尝试为我们使用的Docker容器构建一个备份和恢复解决方案。
我有一个我创建的Docker基础镜像ubuntu:base,不想每次都用Docker文件重新构建它来添加文件。
我想创建一个从主机运行的脚本,并使用ubuntu:base Docker映像创建一个新容器,然后将文件复制到该容器中。
如何将文件从主机复制到容器?
我正在尝试为我们使用的Docker容器构建一个备份和恢复解决方案。
我有一个我创建的Docker基础镜像ubuntu:base,不想每次都用Docker文件重新构建它来添加文件。
我想创建一个从主机运行的脚本,并使用ubuntu:base Docker映像创建一个新容器,然后将文件复制到该容器中。
如何将文件从主机复制到容器?
当前回答
将文件复制到我找到的容器的最佳方法是使用dockerrun命令的-v选项在主机上安装目录。
其他回答
这是对标题中这个问题“将文件从主机复制到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容器?。
将文件复制到我找到的容器的最佳方法是使用dockerrun命令的-v选项在主机上安装目录。
Docker cp命令是一个方便的实用程序,允许在容器和主机系统之间复制文件和文件夹。
如果要将文件从主机系统复制到容器,应使用docker cp命令,如下所示:
docker cp host_source_path container:destination_path
首先使用docker ps命令列出正在运行的容器:
abhishek@linuxhandbook:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
8353c6f43fba 775349758637 "bash" 8 seconds ago Up 7
seconds ubu_container
您需要知道容器ID或容器名称。在我的例子中,docker容器的名称是ubu_container。容器ID为8353c6f43fba。
如果要验证文件是否已成功复制,可以按以下方式输入容器,然后使用常规Linux命令:
docker exec -it ubu_container bash
将文件从主机系统复制到docker容器使用docker cp复制类似于Linux中的复制命令。
我要将一个名为.py的文件复制到容器中的home/dir1目录。
docker cp a.py ubu_container:/home/dir1
如果文件被成功复制,您将不会在屏幕上看到任何输出。如果目标路径不存在,您将看到一个错误:
abhishek@linuxhandbook:~$ sudo docker cp a.txt ubu_container:/home/dir2/subsub
Error: No such container:path: ubu_container:/home/dir2
如果目标文件已经存在,它将被覆盖而不会发出任何警告。
您也可以使用容器ID而不是容器名称:
docker cp a.py 8353c6f43fba:/home/dir1
假设容器已经在运行,请键入给定的命令:
# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"
要使用共享目录共享文件,请键入以下命令运行容器:
# docker run -v /path/to/host/dir:/path/to/container/dir ...
注意:由于容器的用户与主机的用户不同,因此可能会出现权限问题。
如果Dockerfile中没有将目录定义为卷,则/var/lib/docker/aufs/mnt//将起作用。但在某些情况下,容器中的目录被定义为卷。在这种情况下,aufs/mnt/*/下的内容和容器看到的内容不同。
您需要使用docker inspect检查集装箱,然后查找体积。在那里,您可以看到类似/var/lib/docker/vfs/dir/fe940b的内容。。。(id)。您需要在此处添加/修改文件,而不是在aufs/mnt/*下。
令人困惑的是,这些文件也出现在/aufs/mnt/*下。我花了很长时间才弄明白为什么这里的变化对我不起作用。