动态设置docker容器的JAVA_HOME

Pra*_*oor 5 java-home docker dockerfile

我的 docker 容器需要设置 JAVA_HOME。我已将其添加到 Dockerfile 中,如下所示

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
Run Code Online (Sandbox Code Playgroud)

但是,这是值的硬编码。有没有办法可以从图像本身动态获取这个值

Jin*_*alu 12

在docker容器中设置JAVA_HOME

官方镜像默认的Docker文件为Dockerfile

如果你还想要自己的Java home设置镜像。将此行添加到您的Dockerfile

RUN apt-get update && \
    apt-get install -y openjdk-8-jdk && \
    apt-get install -y ant && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/ && \
    rm -rf /var/cache/oracle-jdk8-installer;
    
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME
Run Code Online (Sandbox Code Playgroud)

创建docker-compose.yml,用容器替换动态路径,更新环境变量environment:

  • 我认为问题的关键在于如何动态地做到这一点。这不是动态的。您只需对值进行硬编码,因为您事先知道它是什么。 (2认同)

A.V*_*gas 6

可以在 Dockerfile 指令JAVA_HOME中添加ENV。但是如果 Java 包更新了,您必须更改ENV JAVA_HOMEDockerfile 中的 。

JAVA_HOME但我找到了一种无需更新 Dockerfile 即可自动设置的方法。

RUN export JAVA_HOME="$(dirname $(dirname $(readlink -f $(which java))))"
Run Code Online (Sandbox Code Playgroud)

警告:只有当您使用“&&”操作数在同一个RUN单行命令中运行所有命令时,此命令才有效,如 Mig82 在注释部分中所述。

我希望这可以帮助你。

  • 这行不通。我认为原因是“export”命令——就像使用“RUN”指令执行的任何其他命令一样——在中间容器中运行。因此,唯一可行的方法是,您可以使用“&&”操作数运行单行中设置的任何需要“JAVA_HOME”的内容。像这样: `RUN export JAVA_HOME="$(dirname $(dirname $(readlink -f $(which java))))" && echo $JAVA_HOME`。但是,如果您将“echo”向下移动到自己的新“RUN”指令中,您将得到一个空白(或任何旧的“JAVA_HOME”值)。 (2认同)

Snp*_*nps 2

从Dockerfile 构建的镜像永远是静态的。除非重建,否则它的 Java 位置永远不会改变。

然而,当镜像作为容器启动时,任何事情都可能发生。如果有任何脚本会在运行时编辑 Java 位置,那么该脚本也可能是JAVA_HOME应该更新的地方。

如果您的意思是您想要使用具有不同 java 位置的任意基础映像动态构建映像,那么这可能应该由构建脚本来处理。