数码帮手
白蓝主题五 · 清爽阅读
首页  > 上网防护

Docker镜像环境变量设置:让容器配置更灵活

在日常开发和部署中,很多人会用 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 里,别一不小心提交到代码仓库。

合理使用环境变量,既能保证配置灵活,又能避免敏感信息裸奔。特别是在多人协作或公有云部署的场景下,这一步千万省不得。