我正在考虑使用 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
在这里,你永远不会启动容器。这看起来对我有益。