rpi-mongodb3 容器無法重啟解決方案

tony0087發表於2021-09-09

概述

在上一篇文章中,我們嘗試使用 rpi-mongodb3 來執行 docker mongodb。然而,在實際使用中,系統重啟、關機或者將 mongodb 容器停止後,容器就不能再次被啟動,本文將嘗試找到其原因以及解決方案。
關鍵詞 rpi-mongodb3 mongo.lock

問題描述

首先,我已經建立好一個 rpi-mongodb3 的容器,我們先檢視容器的情況:

docker container ls>>CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                 NAMES
c1514a9534be        andresvidal/rpi3-mongodb3   "/docker-entrypoint.…"   2 hours ago         Up 4 seconds        0.0.0.0:27017->27017/tcp, 28017/tcp   mongodb_home

接下來,我們使用 docker stop 來將容器停止:

docker stop mongodb_home

我們再檢視一下現在容器的狀態:

docker container ls -a>>c1514a9534be        andresvidal/rpi3-mongodb3   "/docker-entrypoint.…"   2 hours ago         Exited (137) 2 minutes ago                       mongodb_home

接下來,我們嘗試重新啟動容器:

docker start mongodb_home
docker container ls -a>>CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                       PORTS               NAMES
c1514a9534be        andresvidal/rpi3-mongodb3   "/docker-entrypoint.…"   2 hours ago         Exited (100) 3 seconds ago                       mongodb_home

我們可以看到,這裡容器並沒有正常被啟動,我們使用 docker log 來檢視一下日誌:

docker logs -f mongodb_home --tail 10 --timestamps>>2018-05-03T11:15:08.601093125Z 2018-05-03T11:15:08.601+0000 I CONTROL  [initandlisten] build info: Linux raspberrypi 4.9.41-v7+ #1023 SMP Tue Aug 8 16:00:15 BST 2017 armv7l BOOST_LIB_VERSION=1_49
2018-05-03T11:15:08.601208904Z 2018-05-03T11:15:08.601+0000 I CONTROL  [initandlisten] allocator: system
2018-05-03T11:15:08.601368694Z 2018-05-03T11:15:08.601+0000 I CONTROL  [initandlisten] options: { net: { http: { RESTInterfaceEnabled: true, enabled: true } }, security: { authorization: "enabled" } }
2018-05-03T11:15:08.625743003Z 2018-05-03T11:15:08.625+0000 W -        [initandlisten] Detected unclean shutdown - /data/db/mongod.lock is not empty.
2018-05-03T11:15:08.656666026Z 2018-05-03T11:15:08.656+0000 I STORAGE  [initandlisten] **************
2018-05-03T11:15:08.656785816Z Unclean shutdown detected.
2018-05-03T11:15:08.656833159Z Please visit  for recovery instructions.
2018-05-03T11:15:08.656869096Z *************
2018-05-03T11:15:08.662197879Z 2018-05-03T11:15:08.661+0000 I STORAGE  [initandlisten] exception in initAndListen: 12596 old lock file, terminating
2018-05-03T11:15:08.662328867Z 2018-05-03T11:15:08.662+0000 I CONTROL  [initandlisten] dbexit:  rc: 100

可以看到日誌,不能重新啟動容器的原因是因為 mongo 非正常關閉,生成了 mongo.lock 檔案。我們根據這個線索,來尋找解決方案。

解決方案一 —— 刪除 mongo.lock

最為簡單粗暴的方法是直接刪除 mongo.lock 檔案,我的 mongodb 容器掛載了資料卷在 /home/pi/db/mongo 之下,我們先刪除 mongo.lock 檔案,再嘗試重啟容器看看是否能成功。

sudo rm -rf /home/pi/db/mongo/mongod.lock
docker start mongodb_home
docker container ls 
>>CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                 NAMES
c1514a9534be        andresvidal/rpi3-mongodb3   "/docker-entrypoint.…"   3 hours ago         Up 14 seconds       0.0.0.0:27017->27017/tcp, 28017/tcp   mongodb_home

我們可以看到,我們的 mongodb 容器又能正常啟動了。

解決方案二 —— 使用 kill 替代 stop 停止容器

在 rpi-mongodb3 的 Github 頁面,有提到可以使用 kill 來停止容器,我們也嘗試以下使用 kill 命令替代 stop 是否能正常停止和重啟:

docker kill --signal=SIGINT mongodb_home
docker container ls -a>>CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                     PORTS               NAMES
c1514a9534be        andresvidal/rpi3-mongodb3   "/docker-entrypoint.…"   3 hours ago         Exited (0) 4 seconds ago
docker start mongodb_home>>docker start mongodb_home
docker container ls>>CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                 NAMES
c1514a9534be        andresvidal/rpi3-mongodb3   "/docker-entrypoint.…"   3 hours ago         Up 6 seconds        0.0.0.0:27017->27017/tcp, 28017/tcp   mongodb_home

這裡我們可以看到,使用 kill 替代 stop 停止容器,容器停止後,容器的狀態是 Exited (0) 而使用 stop 停止容器,容器的狀態是 Exted(100),可以猜測可能是因為 stop 命令使 mongo 容器無法正常停止,從而生成了 mongo.lock 檔案,讓容器的資料庫鎖死保護。

X86平臺的 mongo 官網 docker 映象

為探求這一問題是否 mongo 的 Docker 容器的 Bug,我嘗試在 X86 平臺上嘗試,但並沒有發現類似的問題,可能是由於這個 rpi-mongodb 容器的問題,由於在樹莓派上使用 mongodb docker 映象容器的並不多,到目前為止除了以上兩個解決方案之外並沒有找到更好的解決辦法。因此就只能到這裡為止,日後有更新或者有解決方案,再補充一篇文章再作說明。



作者:speculatecat
連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1747/viewspace-2805911/,如需轉載,請註明出處,否則將追究法律責任。

相關文章