rootless containerd
安装
安装步骤
- https://rootlesscontaine.rs/getting-started/common/
- https://rootlesscontaine.rs/getting-started/containerd/
对于 arch linux 用户:
- 不必安装 dbus-user-session,直接
systemctl --user enable --now dbus
启动即可,可以忽略 unit 缺少[Install] WantedBy=multi-user.target
的提示。 - 需要安装
sudo pacman -S rootlesskit slirp4netns
装好后修改 containerd 的 registry 镜像。(需要注意修改的配置文件路径不同,见下文)
配置
rootless containerd 进程的配置不使用 /etc/containerd/config.toml
,而是使用 ${XDG_CONFIG_HOME}/containerd
。(详见 containerd-rootless.sh,它有一行 mount --bind "${XDG_CONFIG_HOME}/containerd" "/etc/containerd"
)
因此创建默认配置文件需要这样 containerd config default > ~/.config/containerd/config.toml
。
容器内的非 root 用户没权限读写 volume 文件
有些镜像会修改默认用户,这会导致容器内读写宿主机的 volume 文件时报错没权限。 这是因为 uid/gid 映射到宿主机上不是宿主机用户的 uid/gid。有的时候它的 UID 会是 100999。
据我实测,容器内 uid 与宿主机 uid 的映射关系:
容器内 uid | 宿主机 uid |
---|---|
1000 | 100999 |
1100 | 101099 |
9999 | 109998 |
宿主机 uid = 容器内 uid + 100000 -1
解决方法
将容器 uid 和 gid 都置为 0,表示 root 用户。docker run -u 0:0 image cmd
。
如果用 compose.yaml,则在 service 下设置 user: 0:0
。参考 schema/compose-spec.json。