Docker -传递env变量以替换Java max内存

nukf8bse  于 2023-04-20  发布在  Docker
关注(0)|答案(3)|浏览(217)

我有一个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时,我看到一个文件'entrypoint.sh',其中包含我在Dockerfile中指定的java命令。
但是我想根据环境改变java max内存。所以我这样运行。

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

但是当我运行它时,我检查了entrypoint.sh,我没有看到环境变量被替换。我错过了什么吗?
当我实际运行容器时,它是否只在运行中替换?

irlmq6kh

irlmq6kh1#

您需要转义${APP_OPTS}中的$(即,将其更改为\${APP_OPTS})-在docker build期间,变量将被“当前”环境变量替换,也就是env输出中的内容此时调用docker run ... -e "APP_OPTS=-Xmx9144m"不会执行任何操作,因为${APP_OPTS}在创建映像后已被替换。
否则,您可以尝试保存entrypoint.sh文件并将其放在与Dockerfile相同的文件夹中,而不是让Dockerfile创建它(并使用COPY将其放在您想要的位置)。

xuo3flqw

xuo3flqw2#

在entrypoint.sh构建镜像时,www.example.com正在被写入,这样当你运行容器时,RUN语句就不会再次被执行。所以entrypoint.sh文件本身不会被更新。
另一个问题是,当你运行docker时,-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

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

gcxthw6b

gcxthw6b3#

Dockerfile(和RUN命令)仅在构建镜像时执行。SPRING_ENVAPP_UMPFE_OPTS仅在构建期间执行一次。
当您运行映像时,--env=KEY=VALUE被传递到shell(!),运行在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

相关问题