使用Dockerfile与docker-compose部署Java项目调整JVM堆大小失败求助
问题根源
配置不生效的核心原因有两点:
- Dockerfile中
ENV指令的变量替换是镜像构建阶段执行的,你定义JAVA_OPTS时引用的${JVM_XMS}、${JVM_XMX}等变量会在docker build时就被替换为当时的默认值,后续docker-compose传入的运行时环境变量不会再触发JAVA_OPTS的重新拼接。 - 原
JAVA_OPTS配置中-Xmx${JVM_XMX}和-XX:+${JVM_GC}之间缺少空格,会直接导致JVM参数语法错误。
修复方案
1. 修改Dockerfile配置
将JAVA_OPTS的拼接逻辑从构建阶段转移到容器启动阶段,这样就能动态读取运行时传入的环境变量,修复后的Dockerfile如下:
FROM openjdk:8-jdk MAINTAINER whywhathow(whywhathow.fun@gmail.com) ENV \ JVM_GC="UseParallelGC"\ JVM_XMS="128m" \ JVM_XMX="256m" \ NACOS_ADDR="127.0.0.1:8848" RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone COPY ./*.jar /app.jar # 启动时动态拼接JAVA_OPTS和PARAMS,支持读取运行时环境变量 ENTRYPOINT ["/bin/sh","-c","\ JAVA_OPTS=\"-Xms${JVM_XMS} -Xmx${JVM_XMX} -XX:+${JVM_GC} -Djava.security.egd=file:/dev/./urandom\";\ PARAMS=\"--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.server-addr=${NACOS_ADDR} --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml\";\ java ${JAVA_OPTS} -jar app.jar ${PARAMS}\ "]
该方案同时支持运行时修改NACOS_ADDR参数。
2. 重新构建启动容器
修改完Dockerfile后,执行以下命令重新构建镜像并启动,避免使用旧缓存:
docker-compose up -d --build
验证方式
容器启动后执行如下命令,即可查看Java进程实际生效的JVM参数:
docker exec ruoyi-gateway jps -v
内容的提问来源于stack exchange,提问作者whywhathow
相关产品推荐
相关产品推荐

