如何通过Docker CLI将env.local中的环境变量注入Docker容器
Docker CLI加载env.local环境变量到容器的操作方法
Docker原生自带批量加载环境变量文件的参数,不用一个个手动传-e,操作非常直接:
前置检查:先确认你的env.local格式正确
Docker对env文件的格式有明确要求,写错了很容易出现变量加载失败、值解析错误的问题,提前核对规则:
- 每行一组变量,固定格式为
变量名=变量值 - 行首不要加
export这类shell命令前缀 - 值带空格直接写就行,不用额外包一层引号(除非你的业务逻辑本身需要引号作为值的一部分)
- 以
#开头的行会被识别为注释,不会加载进容器
正确的文件示例:
# 数据库配置 DB_HOST=192.168.1.10 DB_PORT=3306 DB_PASS=my db pass with space # 业务配置 APP_ENV=local
启动新容器时直接加载(推荐方案)
用docker run启动容器的时候,加--env-file参数指定env.local的路径即可,支持相对路径和绝对路径:
docker run -d --name myapp --env-file ./env.local 你的镜像名:标签
如果需要同时加载多个环境变量文件,叠加多个--env-file参数即可,后面传入的文件里的同名变量会覆盖前面文件的值,很适合公共配置+本地差异化配置的场景:
docker run -d --name myapp --env-file ./env.base --env-file ./env.local 你的镜像名:标签
针对已经运行中的容器的处理
注意:容器的环境变量是启动时就固化的,没有任何Docker原生命令可以直接给运行中的容器追加全局永久生效的环境变量,只能选下面两种方案:
- (生产环境推荐)停掉旧容器,用上面的
--env-file参数重新启动一个配置一致的新容器,稳定性最高 - (临时测试用)如果只是临时进容器调试用,可以把env.local挂载进容器,进容器后手动source加载,注意容器重启后这部分手动加载的变量会直接失效:
# 如果之前启动容器时没挂载env.local,需要先按这个方式重建容器 docker run -d --name myapp -v $(pwd)/env.local:/tmp/env.local 你的镜像名:标签 # 进入容器后手动加载变量 docker exec -it myapp /bin/sh set -a && source /tmp/env.local && set +a
新手避坑提醒
- 不要把存了密钥、数据库密码的env.local打包进镜像,用
--env-file是启动时从宿主机读取文件内容,不会把敏感信息构建到镜像层里,安全性更高 - 如果传了
--env-file但变量没生效,先检查文件路径是否正确、文件里有没有多余的特殊字符、行尾是不是Windows系统的CRLF换行(Linux容器识别不了CRLF换行,会把变量名解析错误)
内容的提问来源于stack exchange,提问作者ihavequestions
相关产品推荐
相关产品推荐

