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

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

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

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


当前回答

另一个解决方法是使用好的旧scp。这在需要复制目录的情况下非常有用。

从主机运行:

scp FILE_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp foo.txt 172.17.0.2:foo.txt

如果需要复制目录:

scp -r DIR_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp -r directory 172.17.0.2:directory

一定要将ssh安装到容器中。

apt-get install openssh-server

其他回答

我最喜欢的方法:

容器:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

文件.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

or

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt

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

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

cp命令可用于复制文件。

可以将一个特定文件复制到容器中,如:

docker cp foo.txt container_id:/foo.txt

可以从容器复制一个特定文件,如:

docker cp container_id:/foo.txt foo.txt

为了强调,container_id是一个容器id,而不是图像id。(使用docker ps查看包含container_id的列表。)

文件夹src中包含的多个文件可以通过以下方式复制到目标文件夹中:

docker cp src/. container_id:/target
docker cp container_id:/src/. target

参考:Docker CLI docs for cp

在1.8之前的Docker版本中,只能将文件从容器复制到主机。不是从主机到容器。

在docker环境中,所有容器都位于以下目录中:

/var/lib/docker/aufs/必需的docker id/

要将源目录/文件复制到容器的任何部分,请键入给定命令:

sudo cp-r mydir//var/lib/docker/aufs/mnt/required docker-id/mnt/

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

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

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