一、当容器遇见配置:环境变量 vs 配置文件

想象你正在搬家,现在有两类打包方案:要么把所有物品塞进透明塑料袋(环境变量),要么分门别类装进带标签的纸箱(配置文件)。在Docker的世界里,这个选择题每天都在上演。

环境变量示例(Node.js技术栈)

// app.js
const express = require('express');
const app = express();

// 从环境变量读取配置
const PORT = process.env.APP_PORT || 3000;  // 默认值3000
const DB_URL = process.env.DB_HOST;         // 必须设置

app.get('/', (req, res) => {
  res.send(`Connected to ${DB_URL}`);
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
# Dockerfile片段
ENV APP_PORT=4000 DB_HOST=mysql.prod.example.com

关键点

  • ||操作符提供优雅降级
  • 敏感信息需通过docker run -e动态注入

二、配置文件的花式玩法

当配置项超过10个时,环境变量就会像把100把钥匙全挂在腰间。这时YAML/JSON配置文件就像个智能钥匙柜:

ConfigMap实战(Kubernetes+SpringBoot)

# application-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-settings
data:
  application.yml: |
    server:
      port: 8080
    spring:
      datasource:
        url: jdbc:mysql://db-cluster:3306/order_system
        username: ${DB_USER}  # 需配合Secret使用
// SpringBoot应用
@Value("${spring.datasource.url}") 
private String dbUrl;  // 自动注入配置值

组合技

  1. 将ConfigMap挂载为容器内/config目录
  2. 通过spring.config.import实现多文件合并
  3. 使用@ConfigurationProperties实现类型安全绑定

三、十二星座配置法:哪种适合你?

环境变量适合场景

  • 需要频繁修改的开关型参数(如FEATURE_FLAG=enable_ai
  • 跨平台部署时的差异配置
  • 敏感信息(配合Vault等秘钥管理工具)

配置文件闪耀时刻

  • 多层嵌套的复杂配置结构
  • 需要版本控制的参数变更
  • 开发/测试/生产环境差异大的场景

混合模式示例(Python Flask)

# config.py
class Config:
    SECRET_KEY = os.getenv('SECRET_KEY') or 'dev_key'  # 环境变量优先
    SQLALCHEMY_DATABASE_URI = 'postgresql://{user}:{pass}@db:5432/{db}'.format(
        user=os.getenv('DB_USER'),
        pass=os.getenv('DB_PASS'),  # 敏感信息从环境变量获取
        db='app_db'
    )
# 启动命令
docker run -e SECRET_KEY=sup3rs3cr3t -e DB_USER=admin -e DB_PASS=1234 my-flask-app

四、避坑指南与进阶姿势

常见翻车现场

  1. 环境变量注入时机问题:
# 错误示范
RUN echo $BUILD_VERSION > /app/version.txt  # RUN阶段无法获取运行时环境变量
  1. 配置文件权限陷阱:
chmod 600 /config/*.conf  # 防止配置文件被容器内其他进程读取
  1. 配置热更新策略:
# Nginx配置动态加载
nginx -s reload  # 不中断服务重载配置

高阶玩法

  • 使用jq工具在容器启动时动态生成配置
  • 通过consul-template实现配置自动发现
  • 利用--env-file批量管理环境变量

五、终极决策树

下次面临选择困难时,试试这个流程图:

  1. 是敏感信息吗? → 环境变量+秘钥管理
  2. 需要频繁修改吗? → 环境变量
  3. 配置项超过15个? → 配置文件
  4. 需要保留修改历史? → 配置文件+版本控制
  5. 还是不确定? → 混合方案准没错

记住:没有银弹,只有最适合当前场景的解决方案。就像你不会用行李箱装螺丝钉,也不该用塑料袋装精密仪器。