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

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

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

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


当前回答

我通常使用以下命令创建python服务器

python-m SimpleHTTPServer

然后使用wget将文件传输到docker中所需的位置。我知道这不是最好的方法,但我发现这要容易得多。

其他回答

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

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

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

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

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

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

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

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

解决方案如下所示,

从Docker外壳,

root@123abc:/root#  <-- get the container ID

来自主机

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

文件应直接复制到文件系统中容器所在的位置。

真正的交易是:

docker volume create xdata
docker volume inspect xdata

所以你可以看到它的装载点。把你的东西复制到那里然后

docker run  --name=example1 --mount source=xdata,destination=/xdata -it yessa bash

其中yessa是图像名称

另一个解决方法是使用好的旧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