本文目录导读:

在Shell脚本中复制容器内外文件,主要使用 docker cp 命令,以下是详细的用法和示例:
基本语法
docker cp [OPTIONS] SRC_PATH DEST_PATH docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
常用操作示例
从主机复制到容器
#!/bin/bash # 复制单个文件到容器 docker cp /host/path/file.txt container_name:/container/path/ # 复制整个目录到容器 docker cp /host/path/dir/ container_name:/container/path/
从容器复制到主机
#!/bin/bash # 从容器复制文件到主机 docker cp container_name:/container/path/file.txt /host/path/ # 从容器复制目录到主机 docker cp container_name:/container/path/dir/ /host/path/
完整脚本示例
#!/bin/bash
# 容器名称或ID
CONTAINER_NAME="myapp_container"
# 检查容器是否在运行
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
echo "容器 $CONTAINER_NAME 正在运行"
# 复制配置文件到容器
echo "复制配置文件到容器..."
docker cp ./nginx.conf ${CONTAINER_NAME}:/etc/nginx/nginx.conf
# 从容器复制日志文件
echo "从容器复制日志文件..."
docker cp ${CONTAINER_NAME}:/var/log/app.log ./backup/
# 复制整个目录
echo "复制应用代码到容器..."
docker cp ./dist/ ${CONTAINER_NAME}:/usr/share/nginx/html/
echo "文件复制完成"
else
echo "错误: 容器 $CONTAINER_NAME 未运行"
exit 1
fi
高级用法
批量复制多个文件
#!/bin/bash
CONTAINER="webapp"
SRC_FILES=("config.json" "index.html" "style.css")
DEST_PATH="/var/www/html/"
for file in "${SRC_FILES[@]}"; do
if [ -f "$file" ]; then
docker cp "$file" "$CONTAINER:$DEST_PATH"
echo "已复制: $file"
else
echo "警告: $file 不存在"
fi
done
使用变量和错误处理
#!/bin/bash
copy_to_container() {
local source=$1
local container=$2
local destination=$3
if [ ! -e "$source" ]; then
echo "错误: 源路径 $source 不存在"
return 1
fi
if ! docker container inspect "$container" >/dev/null 2>&1; then
echo "错误: 容器 $container 不存在"
return 1
fi
docker cp "$source" "$container:$destination"
local status=$?
if [ $status -eq 0 ]; then
echo "成功: $source -> $container:$destination"
else
echo "失败: 复制 $source 到容器失败"
fi
return $status
}
# 使用函数
copy_to_container "./backup.sql" "database" "/tmp/"
注意事项
-
容器必须运行:
docker cp需要在容器运行时执行 -
路径格式:
- 主机路径:使用绝对路径或相对路径
- 容器路径:可以是绝对路径或相对工作目录的路径
-
权限问题:
# 复制文件后可能需要调整权限 docker exec container_name chmod 644 /path/to/file docker exec container_name chown user:group /path/to/file
-
大文件传输:
# 对于大文件,建议使用压缩 tar czf - /source/path | docker exec -i container_name tar xzf - -C /destination/path
其他工具
除了 docker cp,还有以下替代方案:
# 使用 docker exec 和重定向 cat file.txt | docker exec -i container_name tee /path/to/file.txt # 使用卷挂载(推荐用于持久化数据) docker run -v /host/path:/container/path image_name
docker cp 是最简单直接的方法,适合临时文件传输,对于生产环境,建议使用卷挂载或数据卷容器来管理持久数据。