如何从主机复制文件到Docker容器
技术背景
在使用Docker进行开发和部署时,经常需要将主机上的文件复制到Docker容器中,或者从容器中复制文件到主机。这在配置容器环境、更新应用程序等场景中非常常见。
实现步骤
使用 docker cp
命令
docker cp
是最简单和常用的方法,支持从主机到容器以及从容器到主机的文件复制。
复制单个文件到容器
1
| docker cp foo.txt container_id:/foo.txt
|
从容器复制单个文件到主机
1
| docker cp container_id:/foo.txt foo.txt
|
复制文件夹中的多个文件到容器
1
| docker cp src/. container_id:/target
|
从容器复制文件夹中的多个文件到主机
1
| docker cp container_id:/src/. target
|
在Docker 1.8之前的方法
在Docker 1.8之前,只能从容器复制文件到主机。若要将文件从主机复制到容器,步骤如下:
- 获取容器名称或短容器ID:
- 获取完整容器ID:
1
| docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
|
- 复制文件:
1
| sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
|
使用 docker exec
命令
通过 docker exec
结合 cat
命令将文件内容传递到容器中。
1
| docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
|
使用挂载目录
在启动容器时挂载主机目录,然后在容器内进行文件操作。
1 2 3
| {host} docker run -v /path/to/hostdir:/mnt --name my_container my_image {host} docker exec -it my_container bash {container} cp /mnt/sourcefile /path/to/destfile
|
使用 tar
命令
1
| tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x
|
核心代码
复制单个文件到容器
1
| docker cp foo.txt container_id:/foo.txt
|
使用 docker exec
复制文件
1
| docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
|
使用挂载目录
1
| docker run -v /path/to/hostdir:/mnt --name my_container my_image
|
最佳实践
- 优先使用
docker cp
:该命令简单直接,能满足大多数文件复制需求。 - 使用挂载目录:如果需要频繁在主机和容器之间共享文件,建议在启动容器时挂载主机目录。
- 查看容器ID:使用
docker ps
命令查看容器ID或名称,避免使用错误的ID。
常见问题
- 权限问题:使用挂载目录时,可能会遇到权限问题,因为容器内的用户和主机用户可能不同。可以在容器内调整文件权限来解决。
- 路径问题:目标路径必须预先存在,否则
docker cp
命令会失败。可以先在容器内创建所需路径。 - Docker版本兼容性:在Docker 1.8之前,
docker cp
不支持从主机到容器的文件复制,需要使用其他方法。