前幾天,手邊幾台 Ubuntu 20.04 的電腦似乎是在 apt 更新完後,就開始出現 docker 容器無法正確執行的問題了?
錯誤訊息基本上是:
OCI runtime create failed: container_linux.go:348:
starting container process caused: error adding seccomp filter rule for syscall clone3: permission denied: unknown
這個問題基本上應該不是個案,在網路上也可以找到相關的討論。
在 containerd 的 GitHub 上,就有人提出《issue creating containers due to seccomp failure (error adding seccomp filter rule for syscall clone3: permission denied: unknown, Docker 20.10.10)》這個 issue;而在《Incompatible with docker.io update pending for Ubuntu 20.04: “error adding seccomp filter rule for syscall clone3: permission denied: unknown”》這邊,也可以看到同樣的錯誤。
所以看起來,應該是 docker.io 更新後,和 NVIDIA 提供的 nvidia-container-runtime(為了使用 GPU)衝突所導致的?
已經失效的簡單解法
而 Heresy 注意到的時候,最簡單的解決方法,就是把安裝的 docker.io
降回沒問題的版本就好了;理論上有問題的版本應該是「20.10.7-0ubuntu5~20.04.2」,而只要降版到「20.10.7-0ubuntu1~20.04.2」就沒問題了。
要安裝指定這個特定版本的話,可以透過下面的指令來操作:
apt install docker.io=20.10.7-0ubuntu1~20.04.2
Heresy 發現的時候,當下立刻用這個方法來處理,看來是有效的。但是後來不確定是不是不小心做了什麼事,docker.io 的版本又自己跑回去了?而且如果想要再次降到這個版本,又會出現找不到這個版本的錯誤、而無法完成…
所以,只能放棄這個最簡單的解法了。 orz
暫時放棄 GPU
由於主要的問題應該是 docker 和 nvidia-container-toolkit 衝突,所以如果暫時放棄 nvidia 的 runtime、而回去用標準的 runc 的話,應該是可以用、沒有問題的。
如果要修改的話,可以去開啟「/etc/docker/daemon.json
」這個檔案,把預設的 runtime 由「nvidia」改成「runc」。
雖然這樣一般的 Docker 容器都可以正常地執行,但是相對地,要使用 CUDA 的容器就還是會有問題,所以其實不能算是一個好方法。
使用 RC 版的 nvidia-container-toolkit 1.6.0
這邊另一個可能有效的解法,就是將 nvidia-container-toolkit 切換到 experimental repo 的 16.0~rc.2-1(目前正式版是 1.5.1-1)。
這個方法 Heresy 沒有去測試,如果要用這個方案的話,可以參考 NVIDIA 的官方文件(連結)。
這邊可能稍微要注意的,一般安裝 nvidia-container-toolkit 前所加入的 repository 會是 stable 版的,如果要裝 experimental 的版本,會需要另外加入 experimental 的 repository。
目前使用的方法:改用 docker-ce
Heresy 之前安裝 Docker,都是比較簡單、直接使用 Debian 提供的 docker.io 這個
package;他基本上版本大多會比較舊,但是基本上會是 Ubuntu 官方提供的版本。
而實際上,Docker 官方則還有透過自己的 repository,提供 docker-ce 和
docker-ee,讓使用者安裝;理論上版本會比較新,也會較快得到安全性修正。
像是現在 docker.io 的版本是 20.10.7-0ubuntu5~20.04.2,而 docker-ce 的版本則是 5:20.10.10~3-0~ubuntu-focal。
除了版本的新舊會有明顯的差別之外,兩者的套件相依性架構應該也是有所不同的(參考、參考)。
而 Docker 官方文件中的安裝教學(連結),也是建議移除 docker.io 等套件(他把這些稱為「舊版」)後,加入 docker.com 提供的
repository 來安裝 docker-ce。
其流程如下:
-
移除舊版,指令為
remove docker docker-engine docker.io containerd runc
-
加入 Docker 官方的 repository,指令為:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
安裝 docker-ce
apt update
apt install docker-ce docker-ce-cli containerd.io
不過,如果之前沒有做過類似的操作,可能得在第二步之前,先安裝 ca-certificates、curl、gnupg、lsb-release 這些套件。
在這個問題剛發生的時候,就算是使用 docker-ce 似乎也還是得用較舊的版本才能正確運作。
不過實際上,Heresy 今天在安裝 docker-ce 後,似乎最新版也可以正確地搭配 nvidia 的 runtime 使用了?
所以理論上,現在應該是將 docker.io 移除,改裝 docker-ce 就可以恢復正常了。
不過,Heresy 這邊在重新安裝後,要跑有用到 GPU 的 docker 的時候,會先出現下面的錯誤:
Failed to initialize NVML: Driver/library version mismatch
網路上也有可以找到有人碰過類似的錯誤,解決的方法出乎意料地簡單,就是重開機就好了(參考)。 XD