system / 指令不需加 `sudo` 的方式 === ###### tags: `OS / Ubuntu / cmd / system` ###### tags: `OS`, `Ubuntu`, `linux`, `command`, `system`, `sudo`, `usermod`, `docker` <br> [TOC] <br> ## for Docker ### Error: ``` $ docker run hello-world docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied Run 'docker run --help' for more information ``` ### Troubleshooting ```bash= # 確認已經有 docker 群組 # getent: get entries from Name Service Switch libraries $ getent group docker docker:x:984: # 如果什麼都沒印出來,就先建立它: # $ sudo groupadd docker # 把當前使用者加入 docker 群組 $ sudo usermod -aG docker $USER $ getent group docker docker:x:984:tj # <-- tj # [驗證效果] # - 讓群組設定立即生效(重新登入) # $ logout # - 不用登出的作法:在同一個 shell 開一個新的群組環境 $ newgrp docker # 移除 sudo,直接執行 Docker 指令,應該就不會再跳「permission denied」 $ docker run hello-world ``` - #### 還是要用 sudo? - 確認 id 輸出裡面包含了 docker 群組: ``` $ id uid=1000(tj) gid=984(docker) groups=984(docker),4(adm),24(cdrom), 27(sudo),30(dip),46(plugdev),100(users),114(lpadmin),1000(tj) ``` <br> ## 討論 ### Ubuntu 系統下,讓 `ctr` 指令不需加 `sudo` 的方式 - ### Question 在 Ubuntu 系統,要如何指令可以不用加sudo ? `$ sudo ctr info # containerd CLI` 不是有類似 usrgroup 操作? 像 `$ sudo docker run` -> `$ docker run` - ### gpt-4o (2025/05/29) 你可以像 Docker 一樣,透過設定使用者群組與 socket 權限,讓 `ctr` 指令不需加 `sudo` 執行。 --- ### Docker 為什麼可以不用 sudo? - Docker 安裝後會建立名為 `docker` 的群組。 - Docker Daemon 的 UNIX socket 權限如下: ``` srw-rw---- 1 root docker 0 May 29 10:00 /var/run/docker.sock ``` - 將使用者加入 `docker` 群組後,即可無需 sudo 執行 docker 命令: ``` sudo usermod -aG docker $USER newgrp docker # 或重新登入 ``` --- ### 為什麼 `ctr` 指令無法直接照辦? - `containerd` 的 socket 是: ``` /run/containerd/containerd.sock ``` - 權限通常為: ``` srw-rw---- 1 root root 0 May 29 10:00 /run/containerd/containerd.sock ``` - 沒有預設的群組可加入,因此必須自行設定。 --- ### 自訂群組方式(推薦開發環境使用) **步驟如下:** 1. 建立群組: ``` sudo groupadd containerd ``` 2. 加入該群組: ``` sudo usermod -aG containerd $USER ``` 3. 建立 systemd override 設定: 執行: ``` sudo systemctl edit containerd ``` 加入內容: ``` [Service] ExecStart= ExecStart=/usr/bin/containerd --socket-group containerd ``` 4. 讓 containerd.sock 權限正確: containerd 啟動後會自動套用群組 `containerd`,權限為 `660`。 5. 重新啟動 containerd 並切換群組: ``` sudo systemctl daemon-reexec sudo systemctl restart containerd newgrp containerd ``` 6. 測試是否可無 sudo 執行: ``` ctr info ``` --- ### 安全性提醒 此設定會讓加入 `containerd` 群組的使用者擁有與 root 類似的控制權限(可掛載主機路徑、執行特權容器等),請避免在生產環境或多人共享的系統中使用。 --- 是否需要我幫你自動產生完整的 systemd override 文件與指令清單? <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}