色々なパターンがあると思うが、今回は以下のエラーにより、永遠に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
に書き込めないことによるエラーっぽい。
(追記)むしろ原因は以下かも。
環境
- 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。したら別の問題がある。
(追記)以下が起きていたら先にこれを対応しないといけない。
所感
もはや本当の原因がわからないのだけれど、いずれにせよ直接の原因は mongod.lock
が残ってしまっていることで、Dockerの場合はデバッグ用コンテナからコイツを削除してやることで解決できるはず。
コメント