docker cp 在Docker容器和主机之间复制文件/文件夹

docker cp 命令用于在Docker容器和主机之间复制文件和目录。它可以在容器和主机之间实现双向传输,即从主机复制到容器,也可以从容器复制到主机。

以下是docker cp命令的详细语法和用法:

基本语法

docker cp [OPTIONS] 源路径 目标路径
  • 源路径 和 目标路径 可以是主机路径或容器路径,取决于想要的传输方向。
  • 容器路径格式<容器名称或ID>:<路径>
  • 主机路径格式:直接指定文件或目录路径即可。

注意:容器路径是相对于容器的根目录/

注:docker cp命令会假定容器路径相对于容器的 /(根)目录,主机路径则是相对于执行 docker cp 命令的当前目录

容器可以是正在运行或已停止的容器,名称或ID均可

常用选项

  • -a:保留文件的原始属性(如所有者、权限等)。
  • -L:复制符号链接指向的实际文件。
  • -p:保留文件的时间戳信息。
  • -R 或 -r:递归复制整个目录(默认支持目录复制,不加该选项也能复制整个目录)。

常见用法及示例

1. 从容器复制文件到主机

如果我们有一个容器名为 my_container,想要把容器内的 /app/config.yaml 文件复制到主机的当前目录下,可以使用以下命令:

docker cp my_container:/app/config.yaml ./

示例分析

  • 该命令会将容器中的 /app/config.yaml 文件复制到主机的当前目录下。
  • 使用 ./ 表示复制到主机当前路径。
2. 从主机复制文件到容器

假设主机当前目录下有一个文件 config.yaml,需要将其复制到容器 my_container 的 /app/ 目录下:

docker cp config.yaml my_container:/app/

示例分析

  • 该命令将主机上的 config.yaml 文件复制到容器 my_container 的 /app/ 目录中。
  • 如果 /app/ 目录不存在,需要先在容器中创建目录。
3. 从容器复制目录到主机

要将容器 my_container 中的 /data/logs 目录复制到主机的 /backup 目录中,可以执行以下命令:

docker cp my_container:/data/logs /backup

示例分析

  • 该命令会将容器内的 /data/logs 整个目录复制到主机的 /backup 目录中。
  • 如果主机上的 /backup 目录不存在,Docker 会自动创建。
4. 从主机复制目录到容器

假设主机上有一个目录 my_data/,需要将其复制到容器 my_container 的 /app/ 目录下:

docker cp my_data my_container:/app/

示例分析

  • 该命令会将主机上的 my_data 目录及其内容复制到容器的 /app/ 目录下,保持目录结构。
  • 如果 /app/ 目录已经存在,my_data 会作为子目录复制进去。
5. 复制并覆盖已有文件

如果目标路径已存在同名文件或目录,docker cp 将会覆盖现有内容。例如:

docker cp config.yaml my_container:/app/config.yaml

示例分析

  • 如果容器内 /app/ 下已经有一个 config.yaml 文件,这个文件内容将会被主机的 config.yaml 文件内容覆盖。
6. 复制并重命名文件

可以通过在目标路径中指定文件名来实现文件的重命名。例如:

docker cp config.yaml my_container:/app/new_config.yaml

示例分析

  • 该命令将主机的 config.yaml 文件复制到容器的 /app/ 目录下,并将其命名为 new_config.yaml
7. 使用 -L 选项复制符号链接的目标

假设主机上 symlink 是指向文件 data.txt 的符号链接,使用 -L 参数可以将实际文件复制到容器中:

docker cp -L symlink my_container:/app/data.txt

示例分析

  • 如果不使用 -L,会复制 symlink 这个符号链接本身,而非链接目标文件。

常见错误及解决

  1. 目标路径以 / 结尾但不存在:会导致复制失败。例如:

    docker cp config.yaml my_container:/nonexistent_dir/

    解决:确保目标目录存在,或在容器内先创建该目录。

  2. 源路径或目标路径拼写错误:会报错,提示找不到文件或目录。 解决:检查路径是否正确,包括容器名称或ID的拼写。

  3. 权限问题:某些文件或目录可能需要管理员权限才能访问。 解决:使用 sudo 命令在主机上执行,或在容器中修改文件权限。


在使用 docker cp 命令时,目标路径的结尾是否带有 / 符号会影响文件或目录的复制方式。具体区别如下:

  • 没有 /:表示复制到指定的文件名(会创建或覆盖文件)。
  • 有 /:表示复制到指定的目录(要求目标目录必须存在)。
1. 目标路径不带 /
  • 示例:假设你想将容器中的文件复制到主机的目标路径 testfile.txt(没有 / 结尾)。
docker cp my_container:/app/file.txt testfile.txt

行为

  • 如果 testfile.txt 不存在,该命令会创建一个名为 testfile.txt 的文件,并将容器中的 file.txt 内容复制到这个新文件中。
  • 如果 testfile.txt 已经存在,该命令会用容器中的 file.txt 内容覆盖它。
2. 目标路径带 /
  • 示例:假设你想将容器中的文件复制到主机的目标路径 test/(带有 / 结尾)。
docker cp my_container:/app/file.txt test/

行为

  • 如果 test/ 目录已经存在,命令会将容器中的 file.txt 文件复制到 test/ 目录中,并且文件名保持不变,即最终结果是 test/file.txt
  • 如果 test/ 目录不存在,命令会报错,提示“目标路径不存在”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值