V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kyonn
V2EX  ›  Docker

关于非 root 运行 docker 的问题.

  •  
  •   kyonn · 1 天前 · 967 次点击

    目前了解到非 root 运行容器有几种方案, 有 rootless docker, 将用户加入 docker group. 再往下细分, 目前常见的方案有用 user 参数指定 uid/gid, 还有使用 PUID/PGID 环境变量指定自定义用户.

    使用 user 指定用户, 要求宿主机提前创建相同的 uid/gid, 才能被映射到容器内. 而使用 PUID/PGID 则是容器创建时动态创建用户, 容器初始按 root 权限运行, 随后才切换到非 root 用户.

    https://docs.linuxserver.io/misc/non-root/#why

    现在有这么个需求, 一台 linux 服务器支持 dev container 形式开发环境, 需要让每个用户打开开发容器时在容器内部使用宿主机 uid/gid 的用户, 而不是开发容器默认的 vscode 用户(uid/gid 1000), 有什么比较好的办法?

    当前能想到的方法是改造开发容器镜像, 做成类似 linuxserver 那样的镜像, 通过 PUID 和 PGID 传递用户.

    注: 需求来源是开发容器不会拥有独立 ip, 又要开放 samba 服务, 准备将各用户的家目录通过宿主机的 samba 统一映射出去, 因此需要容器内使用的用户跟宿主机的用户保持一致, 不然会有权限问题.

    第 1 条附言  ·  1 天前
    已解决, dev container 可以自动替换 UID/GID, 之前一直保持 1000 UID 的原因是 GID 是 sudo, 跟容器内已有 GID 冲突, 导致替换逻辑未生效.
    14 条回复    2025-03-17 19:40:41 +08:00
    tinytoadd
        1
    tinytoadd  
       1 天前
    https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user#_specifying-a-user-for-vs-code

    按照文档的说法,默认会保证容器和宿主机 UID 一致的
    yinmin
        2
    yinmin  
       1 天前 via iPhone
    Samba 的用户可以 app 里自定义,应该不会遇到你说的问题吧。

    另外,既然是 linux 了,不如容器里有 sshd ,让用户 ssh 到容器里管理文件,别避免 windows 与 linux 通过 smb 协议造成文件属性的不一致。
    yinmin
        3
    yinmin  
       1 天前
    OP 看看这个 dperson/samba 镜像,应该在 github 开源的。1 个 USERID 和 GROUPID 对应多个 smb 的用户。

    你用 dperson/samba 建一个 smb 容器(或者自己看看这个镜像的源代码自建),统一使用 1000/1000 开多个 smb 用户,然后所有的 dev container 也都使用 1000/1000
    mumbler
        4
    mumbler  
       1 天前
    用 cursor 远程连上远程服务器,agent 模式下,有什么要求尽管提,一会来收作业
    kyonn
        5
    kyonn  
    OP
       1 天前
    @yinmin 容器里部署完整的 sshd+samba 是可以的, 需要每个容器单独 ip, 这样管理就麻烦了(容器数量*用户数量). 我的想法是 宿主机统一管理 samba, 容器只提供开发环境. 相当于代码都在宿主机的家目录下, bind mount 到容器内, 容器内可以修改, 提交代码. 一些其他需求也可以通过 samba 直接从 windows 访问家目录的代码.
    kyonn
        6
    kyonn  
    OP
       1 天前
    @tinytoadd 是我设置问题? 微软的开发容器镜像默认内建了 uid/gid 1000 的用户, 好像并不会自动映射宿主机的用户?
    yinmin
        7
    yinmin  
       1 天前 via iPhone
    @kyonn #5

    每个 dev container 都部署 sshd ,每个 container 的 sshd 映射不同主机端口

    主机上只部署一个 dperson/samba 容器,指定 1000/1000 ,设置不同的用户/密码对应不同的目录(这些 smb 用户都是 1000/1000 权限的)
    kyonn
        8
    kyonn  
    OP
       1 天前
    @tinytoadd 使用 // "remoteUser" 和 "containerUser" 强行设置用户为宿主机用户, 则会在 dev container 创建时提示无法在 /etc/passwd 找到用户. 也好理解, 容器的 dockefile 应该只创建了 1000 作为 uid 的用户.
    kyonn
        9
    kyonn  
    OP
       1 天前
    @yinmin ssh 好说, dev container 自动处理了 ssh 的端口问题, 不用单独去记 ssh 端口. 统一部署个 samba 容器, 创建的文件所属都是 1000:1000, 透过 remote ssh 操作的开发容器, 创建的文件权限也是 1000:1000, 看上去方案不错.

    那么唯一的瑕疵应该是每次新增用户需要维护 samba 映射目录(这个透过脚本也能方便处理), 以及宿主机上不能操作文件, 会创建出跟 容器 权限不兼容的文件.

    不知道分析的对不对?
    kyonn
        10
    kyonn  
    OP
       1 天前
    @yinmin 原本想直接通过 宿主机 samba 统一接入的想法是想利用 域用户鉴权, 统一管理, 用户也不用去管 samba 和 ssh 账户的不同. 如果更换为这种方案的话, 那就是 ssh 和 samba 密码分离, 用户可以修改自己宿主机用户的 ssh 密码, 无法修改 samba 密码. 好像也能接受.
    kyonn
        11
    kyonn  
    OP
       1 天前
    @tinytoadd 看文档意思是会自动更新容器内的 UID/GID, 我再改改配置看.

    > While the remoteUser property tries to automatically update the UID/GID as appropriate on Linux when using a Dockerfile or image, you can use this snippet in your Dockerfile to manually change the UID/GID of a user instead. Update the ARG values as appropriate.
    kaichun
        12
    kaichun  
       1 天前
    印象中 podman 是可以非 root 权限运行的
    kyonn
        13
    kyonn  
    OP
       1 天前
    @kaichun 那个跟 rootless docker 差不多, 有些限制.
    kyonn
        14
    kyonn  
    OP
       1 天前
    已解决, dev container 可以自动替换 UID/GID, 之前一直保持 1000 UID 的原因是 GID 是 sudo, 跟容器内已有 GID 冲突, 导致替换逻辑未生效.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   993 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:54 · PVG 05:54 · LAX 14:54 · JFK 17:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.