首页 > 解决方案 > Docker 子图像不会覆盖 Parent 的 ENV 值

问题描述

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

 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 参数而不是字符串来实现相同的行为?

还有其他方法可以实现这一目标吗?

标签: javadocker

解决方案


当你在下面使用

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>" $@

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

但是你需要确保覆盖你的ENTRYPOINTorCMD来运行/app/start.sh

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


推荐阅读