【问题标题】:ERROR: JAVA_HOME is set to an invalid directory: /usr/lib/jvm/java-8-openjdk-amd64错误:JAVA_HOME 设置为无效目录:/usr/lib/jvm/java-8-openjdk-amd64
【发布时间】:2022-11-03 02:58:07
【问题描述】:

我对 Docker 还很陌生,并且正在努力解决在 Dockerfile 中没有看到 JAVA_HOME 的问题。我得到了名义上的错误;其中包括Please set the JAVA_HOME variable in your environment to match the location of your Java installation.executor failed running [/bin/sh -c /opt/Android/cmdline-tools/latest/bin/sdkmanager --update]: exit code: 1,当它运行RUN /opt/Android/cmdline-tools/latest/bin/sdkmanager --update 时。

我觉得我不知所措,但我认为我的问题是不知道 JDK 安装到哪里或不知道如何从 Dockerfile 中找到它;我尝试回显JAVA_HOME,认为我可以在图像构建时看到它,但同样,没有运气。对此的任何帮助将不胜感激。我一直在用谷歌搜索和尝试一些事情。谢谢你。

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"]

【问题讨论】:

  • 你能在运行RUN /opt/Android/cmdline-tools/latest/bin/sdkmanager --update之前运行RUN ls -lart /usr/lib/jvm/java-8-openjdk-amd64
  • 环境路径=$PATH:$JAVA_HOME/bin我不喜欢那样。应该是ENV PATH=$JAVA_HOME/bin:$PATH 你可以通过运行sudo find / -type f -executable -name java 找出每个java 在哪里来消除一些疑问
  • @harshavmb,当我运行它时,我得到cannot access '/usr/lib/jvm/java-8-openjdk-amd64': No such file or directoryexecutor failed running [/bin/sh -c ls -lart /usr/lib/jvm/java-8-openjdk-amd64]: exit code: 2
  • 我刚刚使用您的 Dockerfile 构建了一个 Docker 映像,它运行良好。你使用的是什么版本的 Docker?您可以尝试使用 docker build --no-cache . 构建吗?
  • “也许,只是在路径的尽头少了一个/bin/- 错误的! JAVA_HOME 的末尾不应有 /bin//bin。约定是它指向目录以上Java 安装的“bin”目录。 (如您所见,OP 这样做:ENV PATH=$PATH:$JAVA_HOME/bin ...)

标签: java docker dockerfile


【解决方案1】:

我建议使用另一个基本图像。为更新的 API 级别构建需要 Java 11:

FROM openjdk:11-jdk as builder
...

然后安装 Python3 和 AWS CLI。

工作示例:cloudbuild-android


或者如果你想继续你的,RUN which java 会告诉你它的实际安装位​​置。

【讨论】:

  • 实际上,由于符号链接,which java 很少有帮助。你想要的是readlink -f "$(which java)"
【解决方案2】:

我认为您的问题在于 Dockerfile 的行终止字符。

你的 Dockerfile 在我的电脑上工作,当涉及到奇怪的错误时,我一直在那里。

我对 Dockerfiles 的经验是,有时它们在 Windows/Unix/Mac 行终止符中非常挑剔,因此请确保使用适合 Unix 机器的行终止符保存 Dockerfile。

我已经使用this other answer 中的方法成功地在 Windows 上使用 Powershell 替换了 Unix 的 Windows 行终止符。我希望这有帮助!

$JAVA_HOME 的确切位置可以通过脚本编写.如果您不认为对该目录进行硬编码是一个安全的选择,请将您的 ENV 行替换为 RUN:RUN export JAVA_HOME=$(readlink -f $(which java) | sed "s:/bin/java::")。这就是我在所有 Linux 机器中设置环境的方式,它的作用如下:

  • which java 搜索 java 并将输出 /usr/bin/java 或类似的东西,这是一个符号链接。
  • readlink -f 以上将带您到达符号链接的目的地。
  • 将这样的目的地传送到| sed "s:/bin/java::" 将去除尾随bin/java 并为您提供正确的值,无论版本如何。

我还尝试了您的 Dockerfile 进行此更改,它也确实有效。

【讨论】:

  • 如果是这种情况,那将是另一个错误消息。可能已经在第一行窃听了。
  • 不,当指定的目录不包含 Java 安装时,错误消息是准确的,这通常是由于文件中有字符导致行尾出现乱码。正如我所说,Dockerfile 的逐字副本有效。并非所有线路都必须失败。
  • /usr/lib/jvm/java-8-openjdk-amd64 没有任何 java 并且 Java 8 无论如何都是错误的 SDK。我同意,不同的行可能有不同的行尾。
  • 出色地。那是你的意见。你一直否认我复制并粘贴 Dockerfile 来工作,这很有趣。
  • 好吧,是您忽略了这是基于NodeJS图像的,并且没有使用NodeJS。对于任何 Java 任务,常识可能建议从 JDK 映像开始。当基于云运行时,最少的处理也更便宜。
【解决方案3】:

在评论中,您提到:

当我运行 [RUN ls -lart /usr/lib/jvm/java-8-openjdk-amd64] 时,我得到 cannot access '/usr/lib/jvm/java-8-openjdk-amd64': No such file or directory

也许我遗漏了一些东西,但是......这不意味着该目录不存在吗?

要么你的路径错误,要么(正如另一个答案所建议的)你的 Dockerfile 中有一些东西,可能是行尾,这会破坏你的行。

要丢弃有关行尾的位,请尝试相同的命令但切换参数,即:

RUN ls /usr/lib/jvm/java-8-openjdk-amd64 -lart

如果现在它抱怨无法识别的选项,那么它可能是一个行尾问题(现在影响 t 选项而不是目录路径)。
然而,如果它仍然No such file or directory,那么你肯定应该检查你的Java安装路径。

【讨论】:

  • 要消除对非打印字符的任何疑问,您可以发布指向实际 Docker 文件副本的链接
【解决方案4】:

看起来您在第一次 docker build 运行期间遇到了一些网络问题。它未能安装 java,但尝试缓存了该层。我建议您在不使用缓存的情况下再次运行构建:docker build -t name --no-cache . 并检查网络操作的日志记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2021-04-13
    • 2017-12-24
    相关资源
    最近更新 更多