Docker SIGILL: illegal instruction 問題除錯記錄

Docker SIGILL: illegal instruction 問題除錯記錄

最近在一台平常執行得好好的伺服器上,遇到一個讓人頭痛的 Docker 問題。
原本 Portainer 和其他容器都可以正常運行,但在系統突然當機後,所有容器在啟動時都出現以下錯誤訊息:

docker: Error response from daemon: failed to create task for container: failed to start shim: start failed: SIGILL: illegal instruction

以下記錄排除問題的經過,給有類似狀況的朋友參考。

OS: Debian GNU/Linux 12 (bookworm) Server: Raspberry Pi 4 Docker: 28.3.0, build 38b7060

前情提要: - Docker 與容器本來可以正常運作 - 其中一個 Container 服務發生當機後,所有 Container 都停止服務 - 所有 Container 都無法啟動,一啟動沒幾秒就會出現docker: Error response from daemon: failed to create task for container: failed to start shim: start failed: SIGILL: illegal instruction

Google 錯誤訊息後,大多數文章都是把問題指向映像檔和 CPU 架構不相容,但在我的環境中應該不太可能。因為同樣的映像檔在當機前是可以執行的。

以下是排查與解決過程: 第一步:重啟治百病 在 Log 皆沒有進一步資訊的情況下,遵循重啟治百病,先重啟 Docker

sudo systemctl restart docker

再試著啟動容器

docker start portainer

結果依然出現一樣的錯誤訊息

第二步:檢查 containerd-shim 接下來懷疑containerd-shim 二進位是否損壞。先確認檔案存在:

which containerd-shim

確認檔案是存在的後,再確認檔案是否正常

file $(which containerd-shim)

file 檢查結果顯示為正常的 ELF 執行檔。

第三步:查看系統日誌 使用 journalctl 以及 dmesg 查看重啟後有沒有關鍵錯誤:

journalctl -xe
dmesg | tail -n 50

除了原本的錯誤訊息外,並沒有其他比較顯眼的錯誤訊息

第四步:系統重啟

sudo reboot

整個系統重新開機後,再重覆第一至第三步,確否是否有恢復正常。可惜很不幸,問題依舊,並沒有好轉。只好繼續。

第五步:刪除容器重建 依前面的結果看起來,懷疑可能是容器的檔案發生問題,試著刪除現存的容器再重建看看

docker rm portainer

重啟

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts

結果發現還是同樣錯誤

第六步:清空 Docker 資料的目錄 接下來猜測有可能是 /var/lib/docker 儲存層損壞,進行備份再清理。

停止 Docker

sudo systemctl stop docker

將現行資料備份到 /root/ 目錄中

sudo tar czvf /root/docker-backup.tgz /var/lib/docker

清空資料

sudo rm -rf /var/lib/docker

再重新啟動 Docker

sudo systemctl start docker

此時 Docker 狀態應該是整個恢復乾淨了

第七步:重新拉映像檔來執行 重新拉取 Portainer 映像:

docker pull portainer/portainer-ce:lts

啟動容器

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts

結果大失所望,居然還是有問題。還有最後一個方向,整個把 Docker 移除後再裝一次

第八步:移除 Docker 重新安裝 停止 Docker

sudo systemctl stop docker

移除 Docker 並重新安裝

sudo apt-get remove --purge docker-ce docker-ce-cli containerd.io
sudo apt-get install docker-ce

然後再重新啟動容器

終於看到正常執行的結果了,此次除錯繞了一大圈,要是一開始直接移除 Docker 重新安裝再重新開機,應該就不用這麼麻煩了,特此記錄,希望對遇到同樣情況的棒油有幫助,少走彎路。

沒有留言:

張貼留言

Docker SIGILL: illegal instruction 問題除錯記錄

Docker SIGILL: illegal instruction 問題除錯記錄 最近在一台平常執行得好好的伺服器上,遇到一個讓人頭痛的 Docker 問題。 原本 Portainer 和其他容器都可以正常運行,但在系統突然當機後,所有容器在啟動時都出現以下錯誤訊息: d...