我正在尝试设置一个 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. EachFROM
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/