Docker-传递环境变量以替换Java最大内存

时间:2019-10-02 19:17:27

标签: docker dockerfile

我有一个如下的Dockerfile。

ENV SPRING_ENV="local"
ENV APP_OPTS "-Xmx8144m"
RUN echo "/usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS}  -Djava.security.egd=file:/dev/./urandom -jar  /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties  -Dspring.profiles.active=${SPRING_ENV} &" > /apps/demo/entrypoint.sh
RUN chmod +x /apps/demo/entrypoint.sh

当我运行dockerfile时,使用在Dockerfile中指定的java命令看到文件“ entrypoint.sh”。

但是我想根据环境更改Java最大内存。所以我就这样跑。

docker run  -it <image_id> sh  -e "APP_OPTS=-Xmx9144m" -e "SPRING_ENV=dev"

但是,当我运行它时,我检查了entrypoint.sh,但看不到环境变量被替换。我想念什么吗?

当我实际运行容器时,它是否只能即时替换?

3 个答案:

答案 0 :(得分:0)

您需要对$中的${APP_OPTS}进行转义(即,将其更改为\${APP_OPTS})-在docker build期间,变量将被“当前”替换。环境变量,该变量将是env输出中的变量(否则为null)。此时调用docker run ... -e "APP_OPTS=-Xmx9144m"不会执行任何操作,因为创建图像后${APP_OPTS}已被替换。

否则,您可以尝试保存entrypoint.sh文件并将其与Dockerfile放在同一文件夹中,而不用让Dockerfile创建它(并使用COPY放在您想要的位置)。这样,${APP_OPTS}环境变量将不会在docker build

期间被替换。

答案 1 :(得分:0)

仅在构建映像时才执行Dockerfile(和RUN命令)。 SPRING_ENVAPP_UMPFE_OPTS仅在构建过程中评估一次。

运行映像时,--env=KEY=VALUE被传递到运行ENTRYPOINTCMD(您需要但没有)中定义的进程的外壳程序(!)。

在Dockerfile顶部附近也缺少一个FROM ...语句。

您将需要定义(建议使用shell形式的)ENTRYPOINT,以调用Java运行时,传递环境变量并运行您的代码(也许没有尝试过):

FROM ???
ENV SPRING_ENV="local"
ENV APP_OPTS "-Xmx8144m"
ENTRYPOINT /usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties -Dspring.profiles.active=${SPRING_ENV}

示例:

FROM busybox
ENV DOG=Freddie
ENTRYPOINT echo ${DOG}

然后:

docker build --tag=58208029 --file=./Dockerfile .
docker run -it 58208029:latest
Freddie

docker run -it --env=DOG=Henry 58208029:latest
Henry

HTH!

答案 2 :(得分:0)

构建映像时将写入entrypoint.sh,因此在运行容器时不会再次执行RUN语句。因此entrypoint.sh文件本身将不会更新。

另一个问题是,当您执行docker run时,-e选项必须位于映像名称和命令之前:

docker run  -it -e "APP_OPTS=-Xmx9144m" -e "SPRING_ENV=dev" <image_id> sh  

否则,这些参数仅作为参数传递给入口点/命令

此外,在Dockerfile中,您可能希望在入口点脚本周围使用单引号,以免在构建时对值进行插值。

RUN echo '/usr/lib/jvm/java-1.8-openjdk/bin/java ${APP_OPTS}  -Djava.security.egd=file:/dev/./urandom -jar  /apps/demo/demo-fe.jar --spring.config.location=file:///apps/demo/conf/ump.properties  -Dspring.profiles.active=${SPRING_ENV} &' > /apps/demo/entrypoint.sh

然后,当您运行容器时,入口点脚本应在运行时从环境读取变量值。