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
这个符号链接本身,而非链接目标文件。
常见错误及解决
-
目标路径以
/
结尾但不存在:会导致复制失败。例如:docker cp config.yaml my_container:/nonexistent_dir/
解决:确保目标目录存在,或在容器内先创建该目录。
-
源路径或目标路径拼写错误:会报错,提示找不到文件或目录。 解决:检查路径是否正确,包括容器名称或ID的拼写。
-
权限问题:某些文件或目录可能需要管理员权限才能访问。 解决:使用
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/
目录不存在,命令会报错,提示“目标路径不存在”。