Shell脚本如何复制容器内外文件

wen 实用脚本 3

本文目录导读:

Shell脚本如何复制容器内外文件

  1. 基本语法
  2. 常用操作示例
  3. 完整脚本示例
  4. 高级用法
  5. 注意事项
  6. 其他工具

在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/"

注意事项

  1. 容器必须运行docker cp 需要在容器运行时执行

  2. 路径格式

    • 主机路径:使用绝对路径或相对路径
    • 容器路径:可以是绝对路径或相对工作目录的路径
  3. 权限问题

    # 复制文件后可能需要调整权限
    docker exec container_name chmod 644 /path/to/file
    docker exec container_name chown user:group /path/to/file
  4. 大文件传输

    # 对于大文件,建议使用压缩
    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 是最简单直接的方法,适合临时文件传输,对于生产环境,建议使用卷挂载或数据卷容器来管理持久数据。

抱歉,评论功能暂时关闭!