基于Amazon Linux2022构建Docker镜像时OpenJDK17解压报错
Docker构建时tar解压报错的解决方法
问题描述
执行docker build -t mydocker:latest构建镜像时出现解压错误,但进入镜像的bash中执行wget操作却能正常工作。
原Dockerfile内容
FROM amazonlinux:2022 RUN mkdir -p /APP WORKDIR APP RUN yum update -y RUN yum install wget -y RUN mkdir -p /usr/share/man/man1/ RUN wget https://download.java.net/java/GA/jdk17/0d483333a00540d886896bac774ff48b/35/GPL/openjdk-17_linux-x64_bin.tar.gz RUN yum install tar -y RUN yum install gzip -y COPY openjdk-17_linux-x64_bin.tar.gz /APP RUN tar xvf openjdk-17_linux-x64_bin.tar.gz
构建报错信息
Step 11/11 : RUN tar xvf openjdk-17_linux-x64_bin.tar.gz ---> Running in 83a94400e4b7 jdk-17/bin/jar jdk-17/bin/jarsigner jdk-17/bin/java jdk-17/bin/javac jdk-17/bin/javadoc jdk-17/bin/javap jdk-17/bin/jcmd jdk-17/bin/jconsole jdk-17/bin/jdb jdk-17/bin/jdeprscan jdk-17/bin/jdeps jdk-17/bin/jfr jdk-17/bin/jhsdb jdk-17/bin/jimage jdk-17/bin/jinfo jdk-17/bin/jlink jdk-17/bin/jmap jdk-17/bin/jmod jdk-17/bin/jpackage jdk-17/bin/jps jdk-17/bin/jrunscript jdk-17/bin/jshell jdk-17/bin/jstack jdk-17/bin/jstat jdk-17/bin/jstatd jdk-17/bin/keytool jdk-17/bin/rmiregistry jdk-17/bin/serialver jdk-17/conf/logging.properties jdk-17/conf/management/jmxremote.access jdk-17/conf/management/jmxremote.password.template jdk-17/conf/management/management.properties jdk-17/conf/net.properties jdk-17/conf/sdp/sdp.conf.template jdk-17/conf/security/java.policy jdk-17/conf/security/java.security jdk-17/conf/security/policy/README.txt jdk-17/conf/security/policy/limited/default_US_export.policy jdk-17/conf/security/policy/limited/default_local.policy jdk-17/conf/security/policy/limited/exempt_local.policy jdk-17/conf/security/policy/unlimited/default_US_export.policy jdk-17/conf/security/policy/unlimited/default_local.policy jdk-17/conf/sound.properties jdk-17/include/classfile_constants.h jdk-17/include/jawt.h jdk-17/include/jdwpTransport.h jdk-17/include/jni.h jdk-17/include/jvmti.h jdk-17/include/jvmticmlr.h jdk-17/include/linux/jawt_md.h jdk-17/include/linux/jni_md.h jdk-17/jmods/java.base.jmod gzip: stdin: unexpected end of file tar: Unexpected EOF in archive tar: Unexpected EOF in archive tar: Error is not recoverable: exiting now
问题原因
你在Dockerfile里的逻辑出现了冲突:先通过wget在容器内下载了完整的压缩包到/APP目录,紧接着用COPY命令把本地主机上的同名文件复制到容器的/APP目录,直接覆盖了刚下载的完整文件。如果本地主机上没有这个文件,或者文件本身不完整,就会导致解压时出现EOF(文件提前结束)错误。
另外原Dockerfile里的WORKDIR APP写法有误,应该写成WORKDIR /APP,否则会在当前目录下创建子目录,而非根目录的/APP。
解决方法
以下两种方案任选其一即可:
方案一:直接使用容器内下载的包(推荐)
删除多余的COPY步骤,直接解压容器内已下载的完整文件,同时合并yum命令减少镜像层数:
FROM amazonlinux:2022 RUN mkdir -p /APP WORKDIR /APP RUN yum update -y && yum install wget tar gzip -y RUN mkdir -p /usr/share/man/man1/ RUN wget https://download.java.net/java/GA/jdk17/0d483333a00540d886896bac774ff48b/35/GPL/openjdk-17_linux-x64_bin.tar.gz RUN tar xvf openjdk-17_linux-x64_bin.tar.gz
方案二:从本地复制文件(适合离线场景)
如果本地已经有完整的压缩包,删除容器内的wget步骤,确保本地文件存在且完整:
FROM amazonlinux:2022 RUN mkdir -p /APP WORKDIR /APP RUN yum update -y && yum install tar gzip -y RUN mkdir -p /usr/share/man/man1/ COPY openjdk-17_linux-x64_bin.tar.gz /APP RUN tar xvf openjdk-17_linux-x64_bin.tar.gz
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

