协慌网

登录 贡献 社区

将文件从 Docker 容器复制到主机

我正在考虑使用 Docker 在持续集成(CI)服务器上构建我的依赖项,这样我就不必在代理本身上安装所有运行时和库。

为了实现这一点,我需要将容器内部构建的构建工件复制回主机。那可能吗?

答案

要将文件从容器复制到主机,可以使用该命令

docker cp <containerId>:/file/path/within/container /host/path/target

这是一个例子:

[jalal@goku scratch]$ sudo docker cp goofy_roentgen:/out_read.jpg .

这里 goofy_roentgen 是我从以下命令获得的名称:

[jalal@goku scratch]$ sudo docker ps
[sudo] password for jalal:
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES
1b4ad9311e93        bamos/openface      "/bin/bash"         33 minutes ago      Up 33 minutes       0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   goofy_roentgen

挂载 “卷” 并将工件复制到那里:

mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# ... build software here ...
cp <artifact> /artifacts
# ... copy more artifacts into `/artifacts` ...
COMMANDS

然后,当构建完成并且容器不再运行时,它已经将构建中的artifacts复制到主机上的artifacts目录中。

编辑

警告:执行此操作时,您可能会遇到与当前正在运行的用户的用户 ID 匹配的 docker 用户的用户 ID 问题。也就是说, /artifacts的文件将显示为用户拥有的 Docker 容器内使用的用户的 UID。解决这个问题的方法可能是使用调用用户的 UID:

docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
    ubuntu:14.04 sh << COMMANDS
# Since $(id -u) owns /working_dir, you should be okay running commands here
# and having them work. Then copy stuff into /working_dir/artifacts .
COMMANDS

您不需要使用docker run

你可以用docker create来做到这一点

从文档中,docker create 命令在指定的映像上创建可写容器层,并准备运行指定的命令。然后将容器 ID 打印到 STDOUT。这类似于 docker run -d,但容器从未启动过。

所以,你可以做到

docker create -ti --name dummy IMAGE_NAME bash
docker cp dummy:/path/to/file /dest/to/file
docker rm -fv dummy

在这里,你永远不会启动容器。这看起来对我有益。