You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何跟踪docker pull进度?远程监控与tee输出异常求助

解决Docker Pull进度监控与日志记录问题

一、获取Docker Pull的整体进度百分比

Docker支持JSON格式的进度输出,通过解析该输出可以计算整体下载进度:

  1. 先获取目标镜像的所有层总大小(以ubuntu:latest为例):

    # 提取所有镜像层的总大小
    TOTAL_SIZE=$(docker pull --progress=json ubuntu:latest 2>&1 | jq -r '.progressDetail | select(.total != null) | .total' | awk '{sum+=$1} END {print sum}')
    

    命令会执行一次pull(镜像已存在时直接返回),通过jq提取各层的总大小,再用awk求和得到总下载量。

  2. 实时监控并计算整体进度:

    docker pull --progress=json ubuntu:latest 2>&1 | while read -r line; do
        # 累加已下载的大小
        DOWNLOADED=$(echo "$line" | jq -r '.progressDetail | select(.current != null) | .current' | awk '{sum+=$1} END {print sum}')
        if [ -n "$DOWNLOADED" ] && [ -n "$TOTAL_SIZE" ]; then
            # 计算百分比并保留两位小数
            PERCENT=$(echo "scale=2; $DOWNLOADED / $TOTAL_SIZE * 100" | bc)
            echo "当前整体进度: ${PERCENT}%"
        fi
    done
    

    脚本会实时解析JSON输出,自动忽略已缓存的镜像层,计算并输出当前整体下载进度。

二、将完整进度信息流式写入文件

Docker默认检测到输出非终端时会关闭动态进度条,以下方法可保留完整进度信息:

方法1:使用script命令模拟终端

script能模拟终端会话,让Docker输出完整的动态进度条:

script -q -c "docker pull ubuntu:latest" pull_progress.log
  • -q:静默模式,不输出script自身的启动/结束提示
  • 执行后pull_progress.log会包含与终端完全一致的进度条、下载大小等动态更新内容。

方法2:使用unbuffer禁用输出缓冲

unbuffer可模拟终端环境并禁用缓冲,需先安装expect包(unbuffer是其组件):

# Debian/Ubuntu安装依赖
apt install expect -y
# CentOS/RHEL安装依赖
yum install expect -y

# 执行命令并写入日志
unbuffer docker pull ubuntu:latest | tee pull_progress.log

方法3:强制使用Plain格式输出

若无需动态进度条,但要保留下载大小等信息,可指定纯文本格式输出:

docker pull --progress=plain ubuntu:latest | tee pull_progress.log

该命令会输出每个镜像层的下载进度详情,无动态刷新但信息完整。

内容的提问来源于stack exchange,提问作者LewlSauce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:06:05