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

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

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

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


当前回答

我刚刚开始使用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

当然是黑客的方法,但那又怎么样!

其他回答

将文件从主机复制到正在运行的容器

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

根据Erik的回答以及Mikl和z0r的评论。

我在这里尝试了大多数(通过投票)的解决方案,但在docker 17.09(2018年)中不再有/var/lib/docker/aufs文件夹。

这个简单的docker cp解决了这个任务。

docker cp c:\path\to\local\file container_name:/path/to/target/dir/

如何获取container_name?

 docker ps 

有一个NAMES部分。不要使用aIMAGE。

答案很好,但过于具体。我发现docker ps是获取您感兴趣的容器id的好方法

mount | grep <id>

查看卷的安装位置。那是

/var/lib/docker/devicemapper/mnt/<id>/rootfs/

对我来说,但这可能是一条不同的路径,具体取决于操作系统和配置。现在只需将文件复制到该路径。

使用-v并不总是实用的。

获取容器名称或短容器id:$docker ps获取完整容器id:$docker inspect-f“{{.Id}}”SHORT_CONTAINER_Id或CONTAINER_NAME复制文件:$sudo cp路径文件host/var/lib/docker/aufs/mnt/FUL_CONTAINER_ID/path-NEW-file

例子:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

or

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

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