docker-compose无法读取.env环境变量导致MongoDB数据初始化失败
问题根因
你遇到的报错是两个问题共同导致的:
- Dockerfile中存在多条
CMD指令:Docker规定每个Dockerfile仅最后一条CMD会生效,同时你使用构建参数传递连接串的用法完全不符合需求 - 本地存在旧的mongo-seed镜像缓存:之前构建的镜像中
DATABASE_URI为空,运行时mongoimport拿到空的URI就会抛出scheme校验错误
另外你当前用构建参数传递数据库连接串的做法会把敏感信息硬编码到镜像中,后续修改连接参数必须重新构建镜像,不符合你仅修改.env调整配置的需求。
修复方案
第一步:修改mongo_seed/Dockerfile
完全删除构建参数相关逻辑,改为直接使用容器运行时注入的环境变量,同时合并两条导入命令到同一条CMD中,还可以增加MongoDB就绪等待逻辑避免启动时序问题:
FROM mongo:3.6.21 # 复制种子数据 COPY factors.json /factors.json COPY filters.json /filters.json # 可选:安装netcat用于等待MongoDB服务完全就绪,避免导入时数据库未启动 RUN apt-get update && apt-get install -y --no-install-recommends netcat && rm -rf /var/lib/apt/lists/* # 合并两条导入命令,直接读取运行时环境变量 CMD sh -c "while ! nc -z mongodb 27017; do sleep 1; done && \ mongoimport --uri \$DATABASE_URI --collection factors --drop --file /factors.json --jsonArray && \ mongoimport --uri \$DATABASE_URI --collection filters --drop --file /filters.json --jsonArray"
第二步:启动时带上构建参数清理旧缓存
在项目根目录执行以下命令启动栈,确保使用最新的Dockerfile构建镜像:
docker compose up --build
方案说明
这个方案完全满足你仅修改.env文件调整配置的需求:
- 不需要修改
docker-compose.yml任何内容,你原有的env_file配置已经会把.env中的所有变量注入到mongo-seed容器运行时环境中 - 数据库连接串不会被硬编码到镜像里,后续修改连接参数只需要更新
.env文件后重启栈即可,不需要重新构建镜像 - 增加的就绪等待逻辑可以避免MongoDB容器刚启动、服务未完全就绪时导入失败的问题
内容的提问来源于stack exchange,提问作者user4851126
相关产品推荐
相关产品推荐

