---
# System prepended metadata

title: system / 指令不需加 `sudo` 的方式
tags: [usermod, system, linux, OS, OS / Ubuntu / cmd / system, command, sudo, Ubuntu, docker]

---

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 %}
