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

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

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

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


当前回答

实现这一点的最简单的方法是,

查找容器iddocker cp<文件名><容器id>:<路径>

其他回答

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 exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

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

如果像我这样的人不清楚@h3nrik答案中的mycontainer是什么意思,它实际上是容器id。为了将/app/example_scenes/1440p60中的WarpSquare.mp4文件从退出的docker容器复制到当前文件夹,我使用了这个。

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

其中docker ps-q-l提取最后退出实例的容器id。如果它不是已退出的容器,您可以通过docker容器ls或docker ps获取它

tar和dockercp是复制目录中所有内容的好组合。

创建数据卷容器

docker create --name dvc --volume /path/on/container cirros

保留目录层次结构

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

检查您的工作

docker run --rm --volumes-from dvc cirros ls -al /path/on/container

将文件复制到正在运行的容器中的另一个解决方案是使用tar:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

将文件foo.sh复制到容器的/tmp中。

编辑:删除reduntant-f,感谢Maartens的评论。