关于非 root 运行 docker 的问题. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kyonn
V2EX    Docker

关于非 root 运行 docker 的问题.

  •  
  •   kyonn 274 天前 2548 次点击
    这是一个创建于 274 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    不知道分析的对不对?
    kyonn
        10
    kyonn  
    OP
       274 天前
    @yinmin 原本想直接通过 宿主机 samba 统一接入的想法是想利用 域用户鉴权, 统一管理, 用户也不用去管 samba 和 ssh 账户的不同. 如果更换为这种方案的话, 那就是 ssh 和 samba 密码分离, 用户可以修改自己宿主机用户的 ssh 密码, 无法修改 samba 密码. 好像也能接受.
    kyonn
        11
    kyonn  
    OP
       274 天前
    @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  
       274 天前
    印象中 podman 是可以非 root 权限运行的
    kyonn
        13
    kyonn  
    OP
       274 天前
    @kaichun 那个跟 rootless docker 差不多, 有些限制.
    kyonn
        14
    kyonn  
    OP
       274 天前
    已解决, dev container 可以自动替换 UID/GID, 之前一直保持 1000 UID 的原因是 GID 是 sudo, 跟容器内已有 GID 冲突, 导致替换逻辑未生效.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     921 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 22:19 PVG 06:19 LAX 14:19 JFK 17:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86