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

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

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

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


当前回答

我在这里尝试了大多数(通过投票)的解决方案,但在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。

其他回答

在我看来,您不必复制图像中的文件,但可以对文件使用GIT或SVN,然后设置与本地文件夹同步的卷。在运行容器时使用脚本,如果不从GIT存储库复制数据,则可以检查本地文件夹中是否已存在数据。这使你的形象非常轻盈。

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

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

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

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

我强烈建议您不要将任何文件复制到任何容器,而是使用docker卷。这将允许您在主机上保存文件。如果您不这样做,那么当您需要升级docker映像/容器时(您应该在包含任何CVE的任何版本上执行此操作),您将删除刚刚上传的文件。

我SFTP到Docker主机(通常是Linux服务器),在那里上传文件。

获取容器名称或短容器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容器后,如果在该容器下创建任何文件;您可以从docker主机的以下位置轻松访问该文件:-

cd/var/lib/dodocker/aufs/container/container_id/tmp

再试一次!