我有一个正在定义的子图像
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>" $@
这将尊重您在运行图像本身时提供的环境变量
但是您需要确保覆盖 ENTRYPOINT
或 CMD
才能运行 /app/start.sh
exec
用于最后确保运行的程序用自身替换 shell 进程
关于java - Docker 子镜像不会覆盖父镜像的 ENV 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61897326/