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

使用wget下载Python 3.10.9.tgz时反复出现异常问题

问题:Docker构建Python时tar解压出现trailing garbage ignored报错
  • 在WSL和VirtualBox环境下的Docker容器中构建Python,间歇性出现解压报错:trailing garbage ignored,构建进程以退出码2终止,问题反复复发
  • 浏览器或终端直接执行wget下载文件完全正常,但通过脚本调用wget时,即使文件字节数一致,解压仍频繁报错
  • 同一wget命令,脚本执行后下载的文件解压失败,手动粘贴到终端执行则解压完美成功

环境变量

# environment values
  PYTHON_DOCKER_IMAGE="ken/python"   
  PYTHON_DOCKER_TAG="3.10.9"  
  UBI_DOCKER_IMAGE="redhat/ubi8"   
  UBI_DOCKER_TAG="8.7"

相关文件内容

build_local.sh脚本

#!/usr/bin/env bash
set -euo pipefail

function build_local() {
  mkdir -p output
  wget \
    -c \
    --no-cache \
    -O output/python.tar.gz \
    "https://www.python.org/ftp/python/${PYTHON_DOCKER_TAG}/Python-${PYTHON_DOCKER_TAG}.tgz"

  docker build \
    --file Dockerfile.python \
    --build-arg UBI_DOCKER_IMAGE="${UBI_DOCKER_IMAGE}" \
    --build-arg UBI_DOCKER_TAG="${UBI_DOCKER_TAG}" \
    --tag "${PYTHON_DOCKER_IMAGE}:${PYTHON_DOCKER_TAG}" \
    --tag "${PYTHON_DOCKER_IMAGE}:latest" \
    .

  docker compose -p "${PROJECT_NAME}" build
}

function main() {
  build_local "$@"
}

main "$@"

Dockerfile.python关键部分

# Dockerfile.python

[snipped basic construction from redhat ubi]

COPY output/python.tar.gz /

RUN mkdir -p /usr/local/src/python && \
    tar -zxf python.tar.gz -C /usr/local/src/python --strip-components=1 && \
    cd /usr/local/src/python && \
    ./configure \
      --enable-loadable-sqlite-extensions \
      --enable-optimizations \
      --enable-option-checking=fatal \
      --with-system-expat \
      --with-ensurepip && \
    make && \
    make altinstall

[snipped a bunch of subsequent construction that runs if the previous lines run, and isn't reached if they fail.]

排查与解决方案

可能原因

  1. 脚本与终端环境差异:脚本执行时的环境变量、wget默认配置(如代理、隐性缓存)和终端不一致,导致下载文件存在隐性损坏(字节数一致但内容结构异常)
  2. Docker构建缓存复用:即使本地修复了文件,Docker可能复用旧的构建上下文,导致损坏文件被重复COPY进镜像
  3. wget断点续传隐患:-c参数在网络波动时可能导致文件拼接异常,表面字节数匹配但压缩包结构已损坏

修复步骤

  1. 移除断点续传参数:把脚本中的wget -c改为wget,避免断点续传带来的文件拼接问题,确保每次下载完整新文件
  2. 强制清理Docker构建缓存:在docker build命令中添加--no-cache参数,彻底杜绝旧损坏文件被复用
  3. 添加文件哈希校验:下载后立即校验文件哈希,从根源上确保文件完整性,避免损坏文件进入构建流程
  4. 清理本地旧文件:构建前删除本地output目录,避免残留旧的损坏文件

修改后的build_local.sh关键片段

function build_local() {
  # 清理旧输出目录
  rm -rf output
  mkdir -p output
  
  # 移除-c参数,下载完整文件
  wget \
    --no-cache \
    -O output/python.tar.gz \
    "https://www.python.org/ftp/python/${PYTHON_DOCKER_TAG}/Python-${PYTHON_DOCKER_TAG}.tgz"

  # 校验文件哈希,确保完整性
  EXPECTED_HASH="$(curl -s https://www.python.org/ftp/python/${PYTHON_DOCKER_TAG}/Python-${PYTHON_DOCKER_TAG}.tgz.sha256 | cut -d' ' -f1)"
  ACTUAL_HASH="$(sha256sum output/python.tar.gz | cut -d' ' -f1)"
  if [ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]; then
      echo "Python压缩包哈希不匹配!终止构建。"
      rm output/python.tar.gz
      exit 1
  fi

  # 禁用Docker构建缓存
  docker build \
    --no-cache \
    --file Dockerfile.python \
    --build-arg UBI_DOCKER_IMAGE="${UBI_DOCKER_IMAGE}" \
    --build-arg UBI_DOCKER_TAG="${UBI_DOCKER_TAG}" \
    --tag "${PYTHON_DOCKER_IMAGE}:${PYTHON_DOCKER_TAG}" \
    --tag "${PYTHON_DOCKER_IMAGE}:latest" \
    .

  docker compose -p "${PROJECT_NAME}" build
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:47:34