You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Spring Boot Docker镜像传递环境参数?

问题分析与解决

你的问题出在两个核心点:ENTRYPOINT的格式导致环境变量无法被解析,以及docker run命令的参数顺序错误。

问题1:ENTRYPOINT格式不支持环境变量解析

你使用了ENTRYPOINT的exec数组格式(["java", ...]),这种模式下Docker会直接启动Java进程,不会通过Shell解析${ENV}变量,JVM会把${ENV}当成字面量处理,自然无法识别。

问题2:docker run参数顺序错误

你把--e ENV=test放在了镜像名称后面,这部分会被当成容器内要执行的命令参数,而非docker run的选项。另外,环境变量的正确选项是-e,不是--e。


解决方案

方案1:修改ENTRYPOINT为Shell格式

将ENTRYPOINT改为Shell字符串格式,让Shell帮你解析环境变量:

ARG ENV
FROM openjdk:11-jdk
COPY target/*.jar app.jar
ENTRYPOINT java -jar -Dspring.profiles.active=${ENV} app.jar

注意:这种方式的缺点是容器的PID 1是Shell进程,可能影响信号处理(比如docker stop无法优雅终止Java进程)。

方案2:保留exec格式并通过Shell解析变量(推荐)

用exec格式调用Shell,既保留exec模式的信号处理优势,又能解析环境变量。同时可以把构建时的ARG转为运行时ENV,方便运行时覆盖:

ARG ENV
FROM openjdk:11-jdk
# 将构建时ARG转为运行时环境变量,允许运行时通过-e覆盖
ENV ENV=${ENV}
COPY target/*.jar app.jar
ENTRYPOINT ["sh", "-c", "java -jar -Dspring.profiles.active=${ENV} app.jar"]

修正docker run命令

把-e选项放在镜像名称前面,正确命令如下:

docker run -p 8100:8080 -e ENV=test anupbiswas1984/docker-env

内容的提问来源于stack exchange,提问作者user3870023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:55:13