网站首页 > 基础教程 正文
技术背景
在使用Docker进行开发和部署时,有时需要将容器内生成的构建工件复制到主机上。例如,在持续集成(CI)服务器上使用Docker构建依赖项,而不希望在代理服务器上安装所有运行时和库,这就需要将容器内构建的工件复制回主机。
实现步骤
方法一:使用docker cp命令
这是最直接的方法,可在容器运行或停止时使用。
- 获取容器ID或名称:使用docker ps -a命令查看所有容器,获取目标容器的ID或名称。
- 复制文件:使用docker cp <containerId>:/file/path/within/container /host/path/target命令复制文件。
# 示例:复制容器内的out_read.jpg文件到当前目录
sudo docker cp goofy_roentgen:/out_read.jpg .
方法二:使用docker create
此方法无需启动容器。
- 创建容器:使用docker create --name dummy IMAGE_NAME命令创建一个容器。
- 复制文件:使用docker cp dummy:/path/to/file /dest/to/file命令复制文件。
- 删除容器:使用docker rm -f dummy命令删除容器。
docker create --name dummy ubuntu
docker cp dummy:/etc/hosts ./hosts
docker rm -f dummy
方法三:挂载卷
通过挂载卷的方式,将容器内的文件复制到主机上。
- 创建目录:在主机上创建一个目录用于存储工件。
- 运行容器并挂载卷:使用docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS命令运行容器并挂载卷。
- 在容器内复制文件:在容器内将工件复制到挂载的卷中。
mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# 构建软件
cp <artifact> /artifacts
COMMANDS
方法四:使用BuildKit的--output选项(Docker 19.03及以上版本)
此方法可跳过创建容器和构建镜像的步骤。
- 构建:使用DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .命令构建并将结果输出到本地目录。
DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .
核心代码
使用docker cp
docker cp <containerId>:/file/path/within/container /host/path/target
使用docker create
docker create --name dummy IMAGE_NAME
docker cp dummy:/path/to/file /dest/to/file
docker rm -f dummy
挂载卷
mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# 构建软件
cp <artifact> /artifacts
COMMANDS
使用BuildKit的--output选项
DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .
最佳实践
- 权限问题:在使用挂载卷的方法时,可能会遇到文件权限问题。可以使用chown命令调整文件的所有者和组。
docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
ubuntu:14.04 sh << COMMANDS
chown -R $(id -u):$(id -g) /working_dir/artifacts
COMMANDS
- 使用容器名称:使用容器名称而不是ID,可提高命令的可读性和可维护性。
常见问题
- 容器未运行时docker cp是否可用:可以,容器不运行时也可以使用docker cp命令。
- 复制目录时出错:如果复制目录时出现权限问题,可以先将目录复制到/tmp/,再从/tmp/移动到目标位置。
docker cp 5f2371a7da7c:/home/euler/mfem/miniapps/navier/3dfoc /tmp/
mv /tmp/3dfoc ~/Downloads/
猜你喜欢
- 2025-05-03 【Docker】部署 Elasticsearch(docker运行elasticsearch)
- 2025-05-03 若依框架改造,阿里docker部署(若依框架开发教程)
- 2025-05-03 软件测试/测试开发丨必知必会的Docker 命令
- 2025-05-03 如何从主机复制文件到Docker容器(如何从主机复制文件到docker容器里)
- 2025-05-03 Windows搭建Agent开发平台-WSL2+Dify本地部署及开发指南
- 2025-05-03 docker安装prometheus和grafana(docker如何安装)
- 2025-05-03 在Debian Docker环境一键部署Dify:手把手教你搭建本地AI应用平台
- 2025-05-03 【Docker】部署Jira&Confluence
- 2025-05-03 精辟!阿里大牛泪解:docker镜像制作——构建企业镜像LAMP+BBS
- 2025-05-03 linux 常用操作(linux常见操作指令)
- 06-18单例模式谁都会,破坏单例模式听说过吗?
- 06-18Objective-c单例模式的正确写法「藏」
- 06-18单例模式介绍(单例模式都有哪些)
- 06-18前端设计-单例模式在实战中的应用技巧
- 06-18PHP之单例模式(php单例模式连接数据库)
- 06-18设计模式:单例模式及C及C++实现示例
- 06-18python的单例模式(单例 python)
- 06-18你认为最简单的单例模式,东西还挺多
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)