在日常开发和部署中,很多人会用 ref="/tag/2019/" style="color:#EB6E00;font-weight:bold;">Docker 来打包应用。比如你写了个小工具,想在不同服务器上跑起来,直接扔个镜像过去最省事。但问题来了:数据库地址、API密钥这些敏感信息总不能写死在镜像里吧?这时候就得靠环境变量来动态配置。
什么是环境变量?
简单说,环境变量就是程序运行时能读到的一组键值对。比如你在本地测试时数据库是 localhost:5432,上线后变成了 db.prod.com:5432,只要通过环境变量传进去,代码不用改一行。
怎么在 Docker 镜像里设置?
最常见的方式是在 Dockerfile 里用 ENV 指令。比如你的应用需要一个运行环境标识:
FROM python:3.9-slim
ENV ENVIRONMENT=production
COPY app.py /app/app.py
WORKDIR /app
RUN pip install flask
ENTRYPOINT ["python", "app.py"]
这样构建出来的镜像,默认 ENVIRONMENT 就是 production。当然你也可以在运行容器时覆盖它:
docker run -e ENVIRONMENT=development your-image-name
实际场景:API 密钥不进代码
假设你做了个天气查询服务,调用第三方接口要带密钥。如果把密钥写进代码再塞到镜像里,万一别人拉到了镜像,岂不是白送?正确的做法是运行时注入:
docker run -e API_KEY=your_real_key123 weather-app
然后在程序里通过 os.getenv("API_KEY") 拿到这个值。这样即使镜像被分享出去,没有环境变量也没法滥用接口。
配合 docker-compose 使用更方便
如果你用 docker-compose.yml 管多个服务,可以直接在里面定义环境变量:
version: '3'
services:
web:
image: my-web-app
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- DEBUG=false
db:
image: postgres:13
启动时执行 docker-compose up,所有变量自动注入,团队成员不用各自折腾配置文件。
敏感信息建议用 secrets 或 .env 文件
虽然 -e 很方便,但直接在命令行写密钥有泄露风险,历史记录可能被人看到。更安全的做法是用 .env 文件:
docker run --env-file ./config.env my-app
而 config.env 内容长这样:
DATABASE_PASSWORD=mysecretpass
API_KEY=xkjd89sjdksj
ADMIN_EMAIL=admin@example.com
记得把这个文件加到 .gitignore 里,别一不小心提交到代码仓库。
合理使用环境变量,既能保证配置灵活,又能避免敏感信息裸奔。特别是在多人协作或公有云部署的场景下,这一步千万省不得。