java应用容器化时环境变量需显式注入:运行时用docker run -e或--env-file、docker-compose environment/env_file;构建时env仅用于非敏感默认值;java代码须校验空值,敏感信息禁明文输出;k8s推荐configmap/secret挂载。

Java 应用在容器化环境中无法自动继承宿主机的环境变量,必须通过显式方式注入。关键不是“能不能读”,而是“怎么安全、可控地传进去”。
运行时注入:docker run 或 docker-compose
这是最常用也最推荐的方式,变量只在启动时传递,不固化进镜像,符合最小权限和配置即代码原则。
-
单个变量:用
-e KEY=VALUE,例如:docker run -e DB_URL=jdbc:mysql://db:3306/app -e APP_ENV=prod my-java-app -
批量变量:准备一个精简的
.env文件(不提交到 Git),用--env-file加载:docker run --env-file ./prod.env my-java-app -
docker-compose.yml 中声明:
environment:- DB_HOST=db- LOG_LEVEL=warn
或引用外部文件:env_file:- ./app.env
构建时注入:Dockerfile 中的 ENV 指令
适合有默认值、非敏感的配置(如 JVM 参数、应用版本号),但不能用于密码、密钥等。
-
ENV JAVA_HEAP_MEMORY=512m设置默认值 -
CMD java -Xms$JAVA_HEAP_MEMORY -Xmx$JAVA_HEAP_MEMORY -jar app.jar在启动命令中引用 - 注意:
ENV定义的变量会被镜像层固化,后续docker run -e可覆盖它,但镜像本身已含该默认值
Java 代码中安全读取
注入后,Java 需主动读取,且必须做空值与合法性校验,避免运行时异常。
- 基础读法:
System.getenv("DB_URL") - 建议封装工具类,统一处理缺失/空值:
String dbUrl = Optional.ofNullable(System.getenv("DB_URL"))<br> .filter(s -> !s.trim().isEmpty())<br> .orElseThrow(() -> new IllegalArgumentException("DB_URL is required")); - 敏感变量(如密码)不要直接打印或记录明文;Spring Boot 可配合
@Value("${db.password:}")+@ConfigurationProperties做类型安全绑定
Kubernetes 场景:ConfigMap / Secret 注入
生产环境推荐用 ConfigMap 管理配置、Secret 管理凭证,再挂载为环境变量。
- YAML 示例:
env:- name: APP_TIMEOUTvalueFrom:configMapKeyRef:name: app-configkey: timeout - Secret 同理,但值需 base64 编码;K8s 会自动解码后作为环境变量提供给容器进程
- 优势:配置与镜像解耦,支持热更新(部分场景)、多环境复用、审计可追溯
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











