Dockerfile中JAVA_HOME配置无效致sdkmanager执行失败求助
我是Docker新手,在Dockerfile中配置JAVA_HOME后仍无法被识别。执行RUN /opt/Android/cmdline-tools/latest/bin/sdkmanager --update时出现以下错误:
ERROR: JAVA_HOME is set to an invalid directory: /usr/lib/jvm/java-8-openjdk-amd64
Please set the JAVA_HOME variable in your environment to match the location of your Java installation.
同时构建返回退出码1:executor failed running [/bin/sh -c /opt/Android/cmdline-tools/latest/bin/sdkmanager --update]: exit code: 1
我不清楚JDK实际安装路径,也不知道如何在Dockerfile中确认该路径,尝试在构建时echo JAVA_HOME也没有结果,附上我的Dockerfile代码:
FROM node:12.12.0 ARG CMDLINE_TOOLS_VERSION=7583922 ARG ANDROID_BUILD_TOOLS=30.0.3 RUN apt-get -qqy update \ && apt-get -qqy install \ python-dev \ --no-install-recommends RUN apt-get install -y software-properties-common gcc RUN apt-get update && apt-get install -y python3-pip RUN pip3 install awscli RUN apt-get install -y jq RUN mkdir -p /usr/share/man/man1 /usr/share/man/man2 RUN apt-get update && apt-get install -y --no-install-recommends openjdk-8-jdk && apt-get clean; ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ENV PATH=$PATH:$JAVA_HOME/bin RUN wget -q https://services.gradle.org/distributions/gradle-4.5.1-bin.zip && unzip gradle-4.5.1-bin.zip -d /opt && rm gradle-4.5.1-bin.zip ENV GRADLE_HOME=/opt/gradle-4.5.1 ENV PATH=$PATH:/opt/gradle-4.5.1/bin RUN wget https://dl.google.com/android/repository/commandlinetools-linux-${CMDLINE_TOOLS_VERSION}_latest.zip RUN mkdir -p /opt/Android/cmdline-tools RUN unzip commandlinetools-linux-7583922_latest.zip -d /opt/Android/cmdline-tools RUN mv /opt/Android/cmdline-tools/cmdline-tools /opt/Android/cmdline-tools/latest ENV ANDROID_HOME=/opt/Android ENV PATH="$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin \ :$ANDROID_HOME/cmdline-tools/latest:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH" RUN /opt/Android/cmdline-tools/latest/bin/sdkmanager --update RUN /opt/Android/cmdline-tools/latest/bin/sdkmanager --list RUN /opt/Android/cmdline-tools/latest/bin/sdkmanager --list | grep build-tools RUN echo y | /opt/Android/cmdline-tools/latest/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" "platform-tools" "platforms;android-30" "tools" >/dev/null RUN yes | /opt/Android/cmdline-tools/latest/bin/sdkmanager --licenses CMD ["yarn", "start"]
解决方案
1. 确认JDK实际安装路径
在Dockerfile中安装完JDK后,添加以下命令,构建时就能看到系统中真实存在的JVM路径:
RUN apt-get update && apt-get install -y --no-install-recommends openjdk-8-jdk && apt-get clean; # 添加这两行查看路径 RUN ls -la /usr/lib/jvm/ RUN update-alternatives --list java
构建镜像时,这两个命令会输出关键信息:
ls命令会列出/usr/lib/jvm/下的所有目录,确认java-8-openjdk-amd64是否存在update-alternatives命令会输出Java可执行文件的完整路径,比如/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java,对应的JAVA_HOME就是去掉/jre/bin/java后的部分,即/usr/lib/jvm/java-8-openjdk-amd64
2. 验证JAVA_HOME设置是否生效
设置ENV后添加验证命令,确保环境变量正确加载且Java环境正常:
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ENV PATH=$PATH:$JAVA_HOME/bin # 添加验证命令 RUN echo "JAVA_HOME is $JAVA_HOME" RUN java -version RUN javac -version
如果javac命令报错,说明安装的是JRE而非JDK,需要重新执行apt-get install -y openjdk-8-jdk命令。
3. 优化后的完整Dockerfile
以下是调整后的Dockerfile,合并冗余命令减少镜像层级,同时加入路径验证步骤:
FROM node:12.12.0 ARG CMDLINE_TOOLS_VERSION=7583922 ARG ANDROID_BUILD_TOOLS=30.0.3 RUN apt-get -qqy update \ && apt-get -qqy install \ python-dev software-properties-common gcc python3-pip jq \ --no-install-recommends \ && pip3 install awscli \ && mkdir -p /usr/share/man/man1 /usr/share/man/man2 \ && apt-get update && apt-get install -y --no-install-recommends openjdk-8-jdk \ && apt-get clean && rm -rf /var/lib/apt/lists/* # 查看JVM路径并验证JAVA_HOME RUN ls -la /usr/lib/jvm/ RUN update-alternatives --list java ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ENV PATH=$PATH:$JAVA_HOME/bin RUN echo "JAVA_HOME is $JAVA_HOME" RUN java -version RUN javac -version RUN wget -q https://services.gradle.org/distributions/gradle-4.5.1-bin.zip && unzip gradle-4.5.1-bin.zip -d /opt && rm gradle-4.5.1-bin.zip ENV GRADLE_HOME=/opt/gradle-4.5.1 ENV PATH=$PATH:/opt/gradle-4.5.1/bin RUN wget https://dl.google.com/android/repository/commandlinetools-linux-${CMDLINE_TOOLS_VERSION}_latest.zip \ && mkdir -p /opt/Android/cmdline-tools \ && unzip commandlinetools-linux-7583922_latest.zip -d /opt/Android/cmdline-tools \ && mv /opt/Android/cmdline-tools/cmdline-tools /opt/Android/cmdline-tools/latest \ && rm commandlinetools-linux-7583922_latest.zip ENV ANDROID_HOME=/opt/Android ENV PATH="$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin \ :$ANDROID_HOME/cmdline-tools/latest:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH" RUN /opt/Android/cmdline-tools/latest/bin/sdkmanager --update \ && /opt/Android/cmdline-tools/latest/bin/sdkmanager --list | grep build-tools \ && echo y | /opt/Android/cmdline-tools/latest/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" "platform-tools" "platforms;android-30" "tools" >/dev/null \ && yes | /opt/Android/cmdline-tools/latest/bin/sdkmanager --licenses CMD ["yarn", "start"]
内容的提问来源于stack exchange,提问作者anonymoose

