Ubuntu 的 Docker 無法使用的問題

| | 0 Comments| 12:48
Categories:

前幾天,手邊幾台 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。

其流程如下:

  1. 移除舊版,指令為

    remove docker docker-engine docker.io containerd runc
  2. 加入 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
  3. 安裝 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

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *