我正在尝试为我们使用的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 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。

获取容器名称或短容器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 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

假设容器已经在运行,请键入给定的命令:

# 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 ...

注意:由于容器的用户与主机的用户不同,因此可能会出现权限问题。

如果您能够使用容器注册表,appendlayer Python包将满足您的要求:

假设ubuntu:base在注册表中已经可用。

然后,您可以使用脚本在上面添加一个由一些本地文件组成的新层,将整个层保存为新图像(即ubuntu:test)。

$ pip install appendlayer
$ tar cvf - test.txt | appendlayer <host> <repository> <old-tag> <new-tag>

所有这些都无需重建或甚至将任何图像数据下载到本地计算机。