Docker 容器中的 JAVA_HOME

标签 java docker dockerfile

我正在尝试设置一个 Dockerfile,以便它具有在容器启动时设置 JAVA_HOME 环境变量设置的说明。然后它安装我的节点应用程序。我需要 xsd-schema-validator 库的 Java 环境。该库需要在容器中设置 JAVA_HOME 环境。这就是我所拥有的:

FROM openjdk:9

ENV JAVA_HOME  /usr/lib/jvm
RUN export JAVA_HOME

RUN echo $JAVA_HOME

FROM collinestes/docker-node-oracle:latest

# Create app directory
WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .
RUN npm run build

RUN npm run package

# Bundle app source
COPY . ./build

CMD [ "node", "bundle-app.js" ]

节点应用程序似乎启动正常。 docker 容器启动时我没有看到任何错误。但是,当我调用应用程序时,它崩溃并出现错误 javaError: spawn javac ENOENT

我认为这是因为容器没有设置 JAVA_HOME 变量。我已经完成了 docker exec -i -t container bash 并尝试了命令 echo $JAVA_HOME ,但它没有显示 java 可执行文件。此外,java 和 javac 命令不起作用。

有人知道我做错了什么吗?任何帮助,将不胜感激。提前致谢!

最佳答案

根据 multi-stage build :

With multi-stage builds, you use multiple FROM statements in your Dockerfile. Each FROM instruction can use a different base, and each of them begins a new stage of the build. You can selectively copy artifacts from one stage to another, leaving behind everything you don’t want in the final image.

注意:您甚至没有将第一阶段中的任何工件用于最终容器,因此您甚至可以丢弃第一个 FROM 阶段...

您还需要在最终镜像中声明 ENV JAVA_HOME/usr/lib/jvm (即,将该行放在最新的 FROM 语句中)。

此外,您需要在最终镜像中同时安装 JDK 和 NodeJS。您可以install the JDK使用当前的基础镜像(因为它上面已经有 NodeJS),或者使用已经用它准备好的镜像(例如 like this one )。

关于Docker 容器中的 JAVA_HOME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58657736/

相关文章:

docker - 如何在运行时将敏感数据发送到 docker 容器

java - 自动为所有文件插入@since标签

mongodb - docker-compose在mongodb中创建用户

java - 发现映射属性的映射方法不明确

docker - 为 Web .net 核心应用程序自动生成 Dockerfile

docker - VS-code 在容器中重新打开 -> ERROR : . PermissionError: [Errno 13] Permission denied

docker - 在容器死之前将文件从容器复制到主机

docker - 不使用命令 "docker run"覆盖 Dockerfile 中的入口点

java.lang.Exception : java. lang.UnsatisfiedLinkError:

java - 使用yearTF.setText(String.format ("%.0f",year))时防止我的 double 向上舍入