在Digital Ocean App Platform部署Docker+MongoDB时遇服务器选择超时问题
问题
从Docker Hub向Digital Ocean App Platform部署应用时,遇到MongoDB连接问题,控制台报错:
server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: mongo:27017, Type: Unknown, Last error: dial tcp: lookup mongo on 10.245.0.11:53: no such host }, ] }
我的docker-compose.yml配置:
version: '3.8' services: app: build: . container_name: app ports: - "8080:8080" depends_on: - mongo environment: MONGO_URL: "mongodb://****:****@mongo:27017/db?authSource=admin&directConnection=true" volumes: - ./data/db:/data/db command: ["./app"] networks: - app-network mongo: image: mongo:6.0 restart: always container_name: mongodb environment: MONGO_INITDB_ROOT_USERNAME: ***** MONGO_INITDB_ROOT_PASSWORD: ***** ports: - "27017:27017" volumes: - /mnt/data/mongo_db_data:/data/db networks: - app-network networks: app-network: driver: bridge
Go代码连接逻辑:
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() mongoURL := os.Getenv("MONGO_URL") clientMongo, err := mongo.Connect(ctx, options.Client().ApplyURI(mongoURL)) if err != nil { panic(err) }
原本期望应用成功连接MongoDB,但抛出服务器选择超时错误。已尝试在连接字符串添加directConnection=true,也确认容器在同一Docker网络,请问问题原因是什么?
可能的原因及解决方案
- Digital Ocean App Platform网络模型不兼容本地Docker Compose:本地配置的
bridge自定义网络在DO平台中不会生效,平台有自己的服务发现机制,不是靠Docker网络实现。你定义的app-network在DO部署时不会被创建,导致mongo主机名无法被解析。 depends_on仅保证启动顺序,不保证服务就绪:depends_on只是让应用容器在MongoDB容器之后启动,但MongoDB启动后还需要完成初始化(比如创建管理员用户、加载服务),此时应用尝试连接会超时。需要在代码中添加连接重试逻辑,或者给MongoDB服务配置健康检查,让应用等待MongoDB完全就绪后再启动。- 连接字符串主机名不符合DO平台规则:如果MongoDB是DO平台内的独立服务,需要使用平台分配的服务域名代替
mongo;如果使用的是DO托管MongoDB(Managed MongoDB),必须替换成托管服务提供的官方连接URI,不能指向容器服务名。 - 卷挂载路径不兼容DO平台:本地的
./data/db和/mnt/data/mongo_db_data这类挂载路径不符合DO App Platform的卷挂载规则,可能导致MongoDB无法初始化数据目录,进而服务启动失败,无法建立连接。
内容的提问来源于stack exchange,提问作者Gustavo Fernando Quintana
相关产品推荐
相关产品推荐

