Docker Compose无法启动全部服务:仅Mongo容器自动启动求助
问题:Mongo-Express容器自动启动失败,手动启动正常
我的Docker Compose配置包含mongodb和mongo-express两个服务,执行启动命令后只有mongo容器能正常创建并运行,手动启动mongo-express容器却可以正常工作。以下是我的配置文件和mongo-express的日志信息,请问哪里配置错了?
我的Docker Compose配置
version: '3' services: mongodb: container_name: mongo image: mongo:4.4.15 ports: - "27017:27017" environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password mongo-express: container_name: mongo-express image: mongo-express ports: - "8081:8081" environment: - ME_CONFIG_MONGODB_ADMINUSERNAME=admin - ME_CONFIG_MONGODB_ADMINPASSWORD=password - ME_CONFIG_MONGODB_SERVER=mongodb
Mongo-Express日志(翻译后)
mongo-express | 欢迎使用mongo-express mongo-express | ------------------------ mongo-express | mongo-express | mongo-express | (node:7) [MONGODB DRIVER] 警告:当前的服务器发现和监控引擎已过时,将在未来版本中移除。要使用新的服务器发现和监控引擎,请将选项 { useUnifiedTopology: true } 传递给MongoClient构造函数。 mongo-express | 无法使用连接字符串连接到数据库:mongodb://admin:password@mongodb:27017/" mongo-express | (node:7) UnhandledPromiseRejectionWarning: MongoNetworkError: 首次连接时无法连接到服务器 [mongodb:27017] [Error: connect ECONNREFUSED 172.20.0.3:27017 mongo-express | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1144:16) { mongo-express | name: 'MongoNetworkError' mongo-express | }] mongo-express | at Pool.<anonymous> (/node_modules/mongodb/lib/core/topologies/server.js:441:11) mongo-express | at Pool.emit (events.js:314:20) mongo-express | at /node_modules/mongodb/lib/core/connection/pool.js:564:14 mongo-express | at /node_modules/mongodb/lib/core/connection/pool.js:1000:11 mongo-express | at /node_modules/mongodb/lib/core/connection/connect.js:32:7 mongo-express | at callback (/node_modules/mongodb/lib/core/connection/connect.js:300:5) mongo-express | at Socket.<anonymous> (/node_modules/mongodb/lib/core/connection/connect.js:330:7) mongo-express | at Object.onceWrapper (events.js:421:26) mongo-express | at Socket.emit (events.js:314:20) mongo-express | at emitErrorNT (internal/streams/destroy.js:92:8) mongo-express | at emitErrorAndCloseNT (internal/streams/destroy.js:60:3) mongo-express | at processTicksAndRejections (internal/process/task_queues.js:84:21) mongo-express | (node:7) UnhandledPromiseRejectionWarning: 未处理的Promise拒绝。此错误要么是因为在async函数中抛出异常但没有catch块,要么是因为拒绝了一个未用.catch()处理的Promise。要在未处理的Promise拒绝时终止节点进程,请使用CLI标志 `--unhandled-rejections=strict`。(拒绝id: 1) mongo-express | (node:7) [DEP0018] 弃用警告:未处理的Promise拒绝已被弃用。未来,未处理的Promise拒绝将终止Node.js进程,并带有非零退出代码。
问题原因及修复方案
原因
mongo-express启动速度比mongodb快,当它尝试连接数据库时,mongodb还没完成初始化(包括创建管理员用户的步骤),导致连接被拒绝,容器直接启动失败。而手动启动时,mongodb已经完全就绪,所以能正常连接。
修复方案
给mongo-express添加依赖规则和健康检查配置,确保它在mongodb完全就绪后再启动。修改后的Docker Compose配置如下:
version: '3' services: mongodb: container_name: mongo image: mongo:4.4.15 ports: - "27017:27017" environment: - MONGO_INITDB_ROOT_USERNAME=admin - MONGO_INITDB_ROOT_PASSWORD=password # 配置健康检查,确认mongodb就绪 healthcheck: test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')", "--username", "admin", "--password", "password", "--authenticationDatabase", "admin"] interval: 5s timeout: 5s retries: 5 mongo-express: container_name: mongo-express image: mongo-express ports: - "8081:8081" environment: - ME_CONFIG_MONGODB_ADMINUSERNAME=admin - ME_CONFIG_MONGODB_ADMINPASSWORD=password - ME_CONFIG_MONGODB_SERVER=mongodb # 等待mongodb健康检查通过后再启动 depends_on: mongodb: condition: service_healthy # 自动重启,防止偶尔连接失败导致容器退出 restart: unless-stopped
配置说明
healthcheck:通过mongo ping命令检测mongodb是否能正常接受连接,确保初始化完成(包括管理员用户创建)。depends_on+service_healthy:让mongo-express等待mongodb的健康检查通过后再启动,避免提前连接导致失败。restart: unless-stopped:即使偶尔出现连接问题,容器也会自动重启,直到成功连接到数据库。
内容的提问来源于stack exchange,提问作者Hasan Humbatov
相关产品推荐
相关产品推荐

