我正在尝试为我们使用的Docker容器构建一个备份和恢复解决方案。
我有一个我创建的Docker基础镜像ubuntu:base,不想每次都用Docker文件重新构建它来添加文件。
我想创建一个从主机运行的脚本,并使用ubuntu:base Docker映像创建一个新容器,然后将文件复制到该容器中。
如何将文件从主机复制到容器?
我正在尝试为我们使用的Docker容器构建一个备份和恢复解决方案。
我有一个我创建的Docker基础镜像ubuntu:base,不想每次都用Docker文件重新构建它来添加文件。
我想创建一个从主机运行的脚本,并使用ubuntu:base Docker映像创建一个新容器,然后将文件复制到该容器中。
如何将文件从主机复制到容器?
当前回答
解决方案如下所示,
从Docker外壳,
root@123abc:/root# <-- get the container ID
来自主机
cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root
文件应直接复制到文件系统中容器所在的位置。
其他回答
如果需要在正在运行的容器上执行此操作,可以使用docker-exec(在1.3中添加)。
首先,查找容器的名称或ID:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9b7400ddd8f ubuntu:latest "/bin/bash" 2 seconds ago Up 2 seconds elated_hodgkin
在上面的示例中,我们可以使用b9b7400ddd8f或相关联的hodgkin。
如果要将主机上/tmp/somefile中的所有内容复制到容器中的/var/www:
$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www
然后,我们可以在容器中执行/bin/bash并验证它是否工作:
$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1 file2
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
将文件从主机复制到正在运行的容器
docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH
根据Erik的回答以及Mikl和z0r的评论。
我刚刚开始使用docker来编译VLC,下面是您可以从容器来回复制文件的方法:
su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt
在这个txt中搜索一个熟悉的文件,你会得到文件夹,cd作为根目录,瞧!复制所有你想要的。
可能有一个包含“merged”的路径,我猜你想要的是包含“diff”的路径。
此外,如果您退出容器并想回到之前的位置:
docker ps -a
docker start -i containerid
我想这很有用,因为你没有用这样的命令命名任何东西
docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash
当然是黑客的方法,但那又怎么样!
如果主机是CentOS或Fedora,则在/var/lib/docker/aufs中没有代理,但它位于/proc:
cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root
此cmd将数据目录的所有内容复制到id为“contained”的容器的/。