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 重新安裝再重新開機,應該就不用這麼麻煩了,特此記錄,希望對遇到同樣情況的棒油有幫助,少走彎路。