Dockerfile中unzstd解压.tar.zst文件报错的排查与解决请求
问题排查:Dockerfile中unzstd解压tar.zst文件失败
我正在调整现有Dockerfile,生成适用于Python 3.12.2的新.tar.gz文件,但执行unzstd命令时遇到问题。使用的Dockerfile如下:
# The same base image as the jenkins agents FROM openjdk:17-jdk-bullseye # install tools we need WORKDIR /package-install ADD zstd_*_amd64.deb zstd.deb RUN dpkg -i zstd.deb # insert the input packages WORKDIR /input ADD cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst python.tar.zst # re-compress the tar archive WORKDIR /build RUN unzstd /input/python.tar.zst -o ./python.tar RUN gzip -k ./python.tar # prepare the output file RUN cp ./python.tar.gz /python.tar.gz RUN chmod a=rw /python.tar.gz # declare the export VOLUME /export WORKDIR / # this will be executed when the container starts CMD [ "cp", "-va", "/python.tar.gz", "/export/" ]
执行unzstd /input/python.tar.zst -o ./python.tar时失败,提示python.tar.zst是一个目录。尝试添加-r参数执行unzstd -r /input/python.tar.zst/ -o ./python.tar后,仍返回错误码1。
补充信息:涉及的文件为cpython-3.12.2+20240224-x86_64-unknown-linux-gnu-pgo-full.tar.zst
问题原因及解决办法
核心原因
Docker的ADD指令会自动识别tar归档文件(包括.zst压缩的tar包),并将其内容解压到目标路径,而不是保留原归档文件。所以执行ADD cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst python.tar.zst后,/input/python.tar.zst实际上是一个包含解压后内容的目录,而非单个压缩文件,这就导致unzstd命令报错。
直接解决方法
用COPY指令替代ADD指令,COPY只会原样复制文件,不会自动解压归档。修改Dockerfile中的对应段落:
原代码:
# insert the input packages WORKDIR /input ADD cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst python.tar.zst
修改后:
# insert the input packages WORKDIR /input COPY cpython-*-x86_64-unknown-linux-gnu-pgo-*.tar.zst python.tar.zst
额外优化建议
- 合并解压与压缩步骤,减少镜像层数并节省磁盘空间:
直接通过管道将unzstd的输出传给gzip,无需生成中间的WORKDIR /build RUN unzstd /input/python.tar.zst -c | gzip > ./python.tar.gzpython.tar文件,加快构建速度。 - 移除冗余的
RUN cp ./python.tar.gz /python.tar.gz指令,后续直接使用/build/python.tar.gz即可,避免无意义的文件复制。
内容的提问来源于stack exchange,提问作者Pascal Michael Bayer
相关产品推荐
相关产品推荐

