我刚开始学习docker,在这里得到了很多东西。这是我的作文。包含mongo和mongo-express最新版本用例的Yaml文件。mongo-express没有连接到mongodb,尝试了在mongo-express重启功能,继续重启mongo-express,我已经足够了,它没有与mongodb连接。我试着给给网络也改变不了什么。
version: "3"
services:
mongodb:
image: mongo
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=password
# networks:
# - mongo-network
mongo-express:
image: mongo-express
# restart: on-failure
ports:
- "8081:8081"
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=admin
- ME_CONFIG_MONGODB_ADMINPASSWORD=password
- ME_CONFIG_MONGODB_ADMINSERVER=mongodb
- ME_CONFIG_MONGODB_PORT=27017
# networks:
# - mongo-network
depends_on:
- mongodb
这是我从mongo-express容器的命令提示符中得到的错误:
2022-11-15 10:39:21 Welcome to mongo-express
2022-11-15 10:39:21 ------------------------
2022-11-15 10:39:21
2022-11-15 10:39:21
2022-11-15 10:39:21 (node:7) [MONGODB DRIVER] Warning: Current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
2022-11-15 10:39:26 Could not connect to database using connectionString: mongodb://mongo:27017"
2022-11-15 10:39:26 (node:7) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [mongo:27017] on first connect [Error: getaddrinfo EAI_AGAIN mongo
2022-11-15 10:39:26 at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) {
2022-11-15 10:39:26 name: 'MongoNetworkError'
2022-11-15 10:39:26 }]
2022-11-15 10:39:26 at Pool.<anonymous> (/node_modules/mongodb/lib/core/topologies/server.js:441:11)
2022-11-15 10:39:26 at Pool.emit (events.js:314:20)
2022-11-15 10:39:26 at /node_modules/mongodb/lib/core/connection/pool.js:564:14
2022-11-15 10:39:26 at /node_modules/mongodb/lib/core/connection/pool.js:1000:11
2022-11-15 10:39:26 at /node_modules/mongodb/lib/core/connection/connect.js:32:7
2022-11-15 10:39:26 at callback (/node_modules/mongodb/lib/core/connection/connect.js:300:5)
2022-11-15 10:39:26 at Socket.<anonymous> (/node_modules/mongodb/lib/core/connection/connect.js:330:7)
2022-11-15 10:39:26 at Object.onceWrapper (events.js:421:26)
2022-11-15 10:39:26 at Socket.emit (events.js:314:20)
2022-11-15 10:39:26 at emitErrorNT (internal/streams/destroy.js:92:8)
2022-11-15 10:39:26 at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
2022-11-15 10:39:26 at processTicksAndRejections (internal/process/task_queues.js:84:21)
2022-11-15 10:39:26 (node:7) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
2022-11-15 10:39:26 (node:7) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
服务器的env var不是ME_CONFIG_MONGODB_ADMINSERVER,而是ME_CONFIG_MONGODB_SERVER。https://hub.docker.com/_/mongo-express
你还需要为mongodb添加一个健康检查,并使mongodb express依赖于它,因为节点在第一次失败的连接后退出代码0退出,因为它在日志中说。如果它以非零退出代码退出,docker将尝试重新启动容器,只要它没有失败。日志中说,这将是未来的方式,但现在你需要健康检查。
(node:7) [DEP0018] DeprecationWarning:未处理的承诺拒绝弃用。在将来,承诺未处理的拒绝将以非零退出码终止Node.js进程。
所以这个组合文件可以工作:
version: "3"
services:
mongodb:
image: mongo
ports:
- "27017:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=password
healthcheck:
test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
interval: 10s
timeout: 10s
retries: 5
start_period: 10s
mongo-express:
image: mongo-express
# restart: on-failure
ports:
- "8081:8081"
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=admin
- ME_CONFIG_MONGODB_ADMINPASSWORD=password
- ME_CONFIG_MONGODB_SERVER=mongodb
- ME_CONFIG_MONGODB_PORT=27017
depends_on:
mongodb:
condition: service_healthy