Docker-Compose部署Flask应用无法连接MongoDB求助
嘿,我来帮你排查下问题,你遇到的Could not resolve host: mongo_service其实是构建镜像阶段的典型问题,咱们一步步拆解解决:
1. Dockerfile中RUN命令无法解析服务名的核心原因
Dockerfile里的RUN curl "mongo_service:27017"是在构建镜像时执行的,这时候你的web镜像还没加入docker-compose创建的共享网络,自然无法识别mongo_service这个服务域名。只有当容器启动后,才会加入到docker-compose的专属网络,此时服务名才能被DNS解析。
解决办法:把这个Mongo连通性测试从镜像构建阶段(RUN)移到容器启动阶段,比如写个启动脚本先测试再启动Flask,或者在启动命令里添加前置检查。
2. 缺失关键环境变量MONGO_URI
你的Flask代码依赖MONGO_URI环境变量连接数据库,但目前docker-compose.yml的web服务里完全没配置这个变量。必须在environment里补上:
MONGO_URI: "mongodb://mongo_service:27017/cat_database"
这样容器启动后,Flask就能通过服务名直接访问MongoDB了。
3. 基础镜像选得不对
你的应用是Flask(Python栈),但Dockerfile用了andreptb/oracle-java:8-alpine这个Java镜像,完全没必要,还会增加镜像体积。换成Python基础镜像才合理,比如python:3.9-alpine,这样才能安装Python依赖运行Flask。
4. Command命令错误导致Flask无法启动
当前docker-compose.yml里的web服务command是echo "success!",这会让容器启动后只输出一行文字就直接退出,根本不会启动Flask服务器。你得改成实际的启动命令,比如python app.py(假设你的Flask主文件是app.py),或者用gunicorn这类WSGI服务器。
修正后的完整配置示例
修正后的docker-compose.yml
version: '2' services: mongo_service: image: mongo # 可选:挂载数据卷持久化MongoDB数据,避免容器删除后数据丢失 volumes: - mongo_data:/data/db web: depends_on: - mongo_service environment: PYTHONUNBUFFERED: 'true' MONGO_URI: "mongodb://mongo_service:27017/cat_database" volumes: - ./docker-data/app/:/app # 明确宿主机与容器的挂载路径,避免匿名卷混乱 build: . command: python app.py # 替换成你的实际Flask启动命令 ports: - '8000:8000' volumes: mongo_data: # 声明MongoDB数据卷
修正后的Dockerfile
# 使用适配Python应用的基础镜像 FROM python:3.9-alpine MAINTAINER Douglas Duhaime <douglas.duhaime@gmail.com> # 设置容器工作目录 WORKDIR /app # 先复制依赖文件,利用Docker缓存优化构建速度 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码到容器 COPY . . # 可选:如果需要启动前测试Mongo连接,可以写个entrypoint脚本 # ENTRYPOINT ["./startup.sh"]
额外提示
depends_on只能保证mongo_service先启动,但不保证MongoDB服务已经完全就绪。如果Flask启动太快,可能会出现初始连接失败的情况,这时候可以给Flask代码加个连接重试逻辑,或者用wait-for-it这类脚本做启动前等待。- docker-compose默认会给同一项目的服务创建共享网络,不需要手动配置
links,depends_on已经足够保证启动顺序和网络连通性。
内容的提问来源于stack exchange,提问作者duhaime

