DockerでMongoDBのコンテナが永遠に再起動する時の対応

色々なパターンがあると思うが、今回は以下のエラーにより、永遠にrestartしていたものと思われる。

2024-11-03 21:25:06 {"t":{"$date":"2024-11-03T12:25:06.020+00:00"},"s":"F",  "c":"CONTROL",  "id":6384300, "ctx":"ftdc","msg":"Writing fatal message","attr":{"message":"DBException::toString(): FileStreamFailed: Failed to write to interim file buffer for full-time diagnostic data capture: /data/db/diagnostic.data/metrics.interim.temp\nActual exception type: mongo::error_details::ExceptionForImpl<(mongo::ErrorCodes::Error)39, mongo::AssertionException>\n\n"}}

/data/db/diagnostic.data/metrics.interim.tempに書き込めないことによるエラーっぽい。

(追記)むしろ原因は以下かも。

あわせて読みたい
DockerのMariaDBコンテナが起動失敗すると思ったら /etc/hosts が60GBで100% usage だった 表題のとおりなのだが、MariaDBコンテナが突然起動に失敗するようになり、永遠に再起動をしていた。で、ログを見るとどうも容量不足っぽかった。……え? # df -h Filesys...
目次

環境

  • Intel Mac mini 2018
  • macOS 14.6.1
  • Docker Desktop 4.35.1
  • Growiのコンテナをたてていた

基本的に初期設定のままだが、 docker-compose.ymlを以下に示す。mongodbのバージョンは6.0。

version: '3'

services:
  app:

--- 省略 ---

  mongo:
    image: mongo:6.0
    restart: unless-stopped
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db

--- 省略 ---

volumes:
  growi_data:
  mongo_configdb:
  mongo_db:
  es_data:

症状

永遠にmongodbのコンテナがrestartする。かろうじてログは取れた。

原因: mongod.lockがemptyじゃない

restart地獄だが幸いはログは取れた。どうも、直接的には/data/db/diagnostic.data/metrics.interim.tempに書き込めないことによるエラーっぽい。

2024-11-03 21:25:06 {"t":{"$date":"2024-11-03T12:25:06.020+00:00"},"s":"F",  "c":"CONTROL",  "id":6384300, "ctx":"ftdc","msg":"Writing fatal message","attr":{"message":"DBException::toString(): FileStreamFailed: Failed to write to interim file buffer for full-time diagnostic data capture: /data/db/diagnostic.data/metrics.interim.temp\nActual exception type: mongo::error_details::ExceptionForImpl<(mongo::ErrorCodes::Error)39, mongo::AssertionException>\n\n"}}

なんでそうなるかというと、恐らく mongod.lockがemptyではないためにmongodを起動できず、権限がなかったのではないか。以下のようなログが残っていた。

2024-11-03 21:24:59 {"t":{"$date":"2024-11-03T12:24:59.534+00:00"},"s":"W",  "c":"STORAGE",  "id":22271,   "ctx":"initandlisten","msg":"Detected unclean shutdown - Lock file is not empty","attr":{"lockFile":"/data/db/mongod.lock"}}

直前にMacを再起動したのだが、その時に正常に終了できなかったことに起因してるかもしれない。今となっては大元の原因は不明である。。。

対応: デバッグ用コンテナを作ってロックファイルを削除

ロックファイル mongod.lockを削除する。

ただし、コンテナは起動したそばからterminateしてしまうため、デバッグ用のコンテナを作ってそこからファイルをいじる。今回の例だと、以下のような docker-compose.override.ymlファイルを作って、デバッグ用のmongoコンテナとする。

version: '3'

services:
  mongo:
    entrypoint: /bin/bash
    tty: true
    restart: "no"

この状態でコンテナを起動。

docker compose up -d mongo
docker compose exec mongo /bin/bash

ログイン後、ファイルを削除し、データベースを修復する。

rm -f /data/db/mongod.lock
mongod --repair --dbpath /data/db

ログアウトして、コンテナを落とす。

docker compose down

docker-compose.override.ymlを削除する。削除後、コンテナを起動。

docker compose up -d

再起動しないことを祈る。しなければOK。したら別の問題がある。

(追記)以下が起きていたら先にこれを対応しないといけない。

あわせて読みたい
DockerのMariaDBコンテナが起動失敗すると思ったら /etc/hosts が60GBで100% usage だった 表題のとおりなのだが、MariaDBコンテナが突然起動に失敗するようになり、永遠に再起動をしていた。で、ログを見るとどうも容量不足っぽかった。……え? # df -h Filesys...

所感

もはや本当の原因がわからないのだけれど、いずれにせよ直接の原因は mongod.lock が残ってしまっていることで、Dockerの場合はデバッグ用コンテナからコイツを削除してやることで解決できるはず。

本サイトはUXを悪くするevilなGoogle広告を消しました。応援してくださる方は おすすめガジェット を見ていってください!
よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次