越来越多的项目使用docker进行环境搭建,统一了开发和运行环境,好处颇多。但同时也引入了许多复杂性,比如一些容器服务突然无法启动,那么debug起来就比物理机安装的服务麻烦一些。
这段时间Mac Pro经常出现莫名卡死的情况,我在没有办法的情况下只能强制关机,于是我遇到了再次开机后无法启动某个项目中的MongoDB容器的问题。
查看该mongoDB容器的日志,一大段非常复杂的输出,其中最重要的报错信息如下:

 Fatal Assertion 28558 at src/mongo/db/storage/wiredtiger/wiredtiger_util.cpp 365

Google了一波之后发现很多人遇到了类似的问题,都是因为之前异常中断了容器或者像我一样强制关机,导致mongoDB的本地数据中有一些破损的数据。所以需要对mongoDB进行修复。如果是物理机安装的话可以直接执行如下命令进行修复:

mongod --dbpath=/path/to/db --repair

而如果是像我一样,用docker-compose进行编排安装的mongodb,那么需要先单独运行mongodb容器并进入该容器,然后再执行修复命令。
假设我有如下的docker-compose.yml文件,其中mongodb的部分如下:

 my-mongo:
    container_name: my-mongo
    image: mongo:5.0
    ports:
      - 27018:27017
    volumes:
      - .db/data:/data/db
    healthcheck:
      test: mongo --port 27017 --eval "db.serverStatus()" > /dev/null || exit 1
      interval: 30s
      timeout: 30s
      retries: 10

那么我需要运行如下命令来单独运行mongodb容器:

docker-compose -f docker-compose.yml run -it my-mongo sh

然后可以顺利进入容器,在容器里面执行修复命令对破损的mongodb数据进行修复:

mongod --dbpath /data/db --repair

之后退出再重启mongodb容器就能正常运行了。所以面对突发的问题不能慌张,耐心去分析问题本质,思考之后再合理上网找到解决办法。