java - Docker 子镜像不会覆盖父镜像的 ENV 值

标签 java docker

我有一个正在定义的子图像

 ARG MX_HEAP_SET=1024
    ARG MN_HEAP_SET=1024
    ENV MX_HEAP_SET=${MX_HEAP_SET:-${MX_HEAP_SET}}
    ENV MN_HEAP_SET=${MN_HEAP_SET:-${MN_HEAP_SET}}
    ENV HEAP_SET="-Xmx${MX_HEAP_SET}m -Xms${MN_HEAP_SET}m"
    ENV HEAP_SET=${HEAP_SET:-${HEAP_SET}}

并期望替换默认值HEAP_SET它被放置在基础图像中。 因此,当我运行没有任何 MX 或 MN 值的基础镜像时,它可以正常工作。

但是,一旦我使用 docker run -e MX_HEAP_SET=2048 运行子图像, ,我仍然在容器中看到默认值。

但是一旦我运行 d ocker run -e HEAP_SET="-Xmx2048m -Xms1024m"我看到了变化。 那么,如何使用单独的 MAX 和 MIN 参数而不是字符串来实现相同的行为?

还有其他方法可以达到这个目的吗?

最佳答案

当您使用以下内容时

ARG MX_HEAP_SET=1024

这意味着您正在添加构建时间参数。这只能在 docker 构建期间被覆盖。您需要的是启动 bash 文件

/app/start.sh

#!/bin/sh

# export all variables from here on
set -a

MX_HEAP_SET=${MX_HEAP_SET:-1024}
MN_HEAP_SET=${MN_HEAP_SET:-1024}
MX_HEAP_SET=${SDC_MX_HEAP_SET:-${MX_HEAP_SET}}
MN_HEAP_SET=${SDC_MN_HEAP_SET:-${MN_HEAP_SET}}
HEAP_SET="-Xmx${MX_HEAP_SET}m -Xms${MN_HEAP_SET}m"
HEAP_SET=${HEAP_SET:-${HEAP_SET}}
exec "<yourstarting command>" $@

这将尊重您在运行图像本身时提供的环境变量

但是您需要确保覆盖 ENTRYPOINTCMD 才能运行 /app/start.sh

exec 用于最后确保运行的程序用自身替换 shell 进程

关于java - Docker 子镜像不会覆盖父镜像的 ENV 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61897326/

相关文章:

java - (spotify)Java的Maven docker构建器

angularjs - 如何在不打开浏览器的情况下在 docker 环境中测试 Angular 应用程序?

amazon-web-services - 在 EKS 上的 Kubernetes 1.14 上启动 Helm Chart stable/minecraft 失败 Liveness Probe

java - 调用存储过程

java - 整数求和

java - 在创建对象的过程中将变量的值添加到对象的名称中

ubuntu - Docker 是在 WSL 中运行还是连接回 Windows?

java - 如何在同一行上使用 map 和 orElseThrow?

java - 自动扩展后端 - Appengine Java

docker - 了解Postgresql的简单dockerfile