使用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.]
排查与解决方案
可能原因
- 脚本与终端环境差异:脚本执行时的环境变量、wget默认配置(如代理、隐性缓存)和终端不一致,导致下载文件存在隐性损坏(字节数一致但内容结构异常)
- Docker构建缓存复用:即使本地修复了文件,Docker可能复用旧的构建上下文,导致损坏文件被重复COPY进镜像
- wget断点续传隐患:
-c参数在网络波动时可能导致文件拼接异常,表面字节数匹配但压缩包结构已损坏
修复步骤
- 移除断点续传参数:把脚本中的
wget -c改为wget,避免断点续传带来的文件拼接问题,确保每次下载完整新文件 - 强制清理Docker构建缓存:在
docker build命令中添加--no-cache参数,彻底杜绝旧损坏文件被复用 - 添加文件哈希校验:下载后立即校验文件哈希,从根源上确保文件完整性,避免损坏文件进入构建流程
- 清理本地旧文件:构建前删除本地
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
相关产品推荐
相关产品推荐

