从Docker容器复制文件到主机的四种方法

 更新时间:2025年06月16日 10:37:14   作者:1010n111  
在使用Docker进行开发和部署时,有时需要将容器内生成的构建工件复制到主机上,例如,在持续集成服务器上使用Docker构建依赖项,而不希望在代理服务器上安装所有运行时和库,所以本文给大家介绍了从Docker容器复制文件到主机的四种方法

技术背景

在使用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/

到此这篇关于从Docker容器复制文件到主机的四种方法的文章就介绍到这了,更多相关Docker复制文件到主机内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker安装tomcat并部署Springboot项目war包的方法

    docker安装tomcat并部署Springboot项目war包的方法

    这篇文章主要介绍了docker安装tomcat并部署Springboot项目war包的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Docker数据存储之Volumes详解

    Docker数据存储之Volumes详解

    今天小编就为大家分享一篇关于Docker数据存储之Volumes详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • docker中查看日志的几种常见方式

    docker中查看日志的几种常见方式

    这篇文章主要给大家介绍了关于docker中查看日志的几种常见方式,Docker提供一些方式来查看容器的日志,文中将每种方法都给出了代码示例,需要的朋友可以参考下
    2023-08-08
  • Docker的镜像制作方法详解

    Docker的镜像制作方法详解

    这篇文章主要介绍了Docker的镜像制作方法的相关资料,文章讲解了Docker镜像的基本原理、结构和制作方式,镜像是创建Docker容器的基础,需要的朋友可以参考下
    2024-10-10
  • Docker安装并使用Mysql的详细教程(实测可用!)

    Docker安装并使用Mysql的详细教程(实测可用!)

    在日常的工作中经常会需要将数据存在服务器,经常用到的数据库是mysql,下面这篇文章主要给大家介绍了关于Docker安装并使用Mysql的详细教程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • docker镜像访问本地elasticsearch端口操作

    docker镜像访问本地elasticsearch端口操作

    这篇文章主要介绍了docker镜像访问本地elasticsearch端口操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • IDEA部署Docker到WSL2的详细过程

    IDEA部署Docker到WSL2的详细过程

    这篇文章主要介绍了IDEA 部署 Docker 到 WSL2的过程详解,本地环境Windows10+WSL2(Ubuntu),具体操作过程跟随小编一起看看吧
    2021-07-07
  • Docker 启动Redis 并设置密码的操作

    Docker 启动Redis 并设置密码的操作

    这篇文章主要介绍了Docker 启动Redis 并设置密码的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Docker容器跨主机通信中直接路由方式详解

    Docker容器跨主机通信中直接路由方式详解

    在本篇文章里我们给各位整理的是一篇关于Docker容器跨主机通信中直接路由方式详解内容,有需要的朋友们可以参考下。
    2019-10-10
  • docker-compose部署Java应用和相关依赖方式

    docker-compose部署Java应用和相关依赖方式

    介绍如何使用docker-compose一键部署Java应用及依赖,并实现MySQL数据库的自动初始化
    2024-10-10

最新评论