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

docker 非 root,怎么玩 cron?

  •  
  •   ODD10 · 2021-02-20 08:56:17 +08:00 · 3351 次点击
    这是一个创建于 1133 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2021-02-20 09:50:52 +08:00

    别人写好的Dockerfile,但是root运行的,里面有.sh和cron;我改为使用非root用户,跑起来提示cron权限问题。不怎么该怎么修改使用。

    第 2 条附言  ·  2021-02-20 10:14:11 +08:00

    别来问我有啥意义了...
    我寻思我懂了,还问个锤子..

    懂得,有时间的,可以给大伙说说。非常感谢🙏

    27 条回复    2021-03-29 19:33:58 +08:00
    maocat
        1
    maocat  
       2021-02-20 09:05:02 +08:00   ❤️ 1
    怎么还要在 docker 里面分用户吗,玩的也太细了
    Tink
        2
    Tink  
       2021-02-20 09:09:04 +08:00
    docker 里面的非 root 用户?
    yonng
        3
    yonng  
       2021-02-20 09:45:59 +08:00
    想在 docker 里直接跑那不是要跑个类似 crond 的进程么,那又要引入一个 init 进程。。。操作有点骚。。。

    如果运行 docker 的宿主机固定直接加在宿主机上,如果依赖容器中的库或者程序可以通过 `docker exec`
    sadfQED2
        4
    sadfQED2  
       2021-02-20 09:59:10 +08:00 via Android
    Docker 里面还要分用户的意义是啥?

    如果你非要分,应该得先用 root 账号启动 crond 进程,然后使用普通用户添加任务
    ODD10
        5
    ODD10  
    OP
       2021-02-20 10:00:34 +08:00 via iPhone
    @maocat #1
    查过,非 root 用户运行,这样会安全一些; docker 宿主机运行 top,你可以看到 docker 如果是使用 root,你可以看到 user 也是 root 。
    https://i.loli.net/2021/02/20/wheki6dxjYzDJE3.jpg?width=828&height=1792
    GuuJiang
        6
    GuuJiang  
       2021-02-20 10:05:36 +08:00 via iPhone
    docker 不是虚拟机
    docker 不是虚拟机
    docker 不是虚拟机

    所以在 docker 里跑 cron 本身很可能就是个 XY 问题
    ODD10
        7
    ODD10  
    OP
       2021-02-20 10:06:12 +08:00 via iPhone
    @sadfQED2 #4
    提高安全性,我也不懂。
    我先宿主机添加用户,再在 Dockerfile 配置添加使用用户,uid 、gid 啥的都要一致。
    我想既然存在,就有它的意义。
    ODD10
        8
    ODD10  
    OP
       2021-02-20 10:07:53 +08:00 via iPhone
    @GuuJiang #6
    词组:xy
    释义:香烟, 夏颜, 谢迎, 徐逸, 闲鱼, 谢邀, 西柚, 小悦, 戏影, 谢俞, 信誉, 薛洋, 夏亚, 筱雨, 逍遥, 蟹圆, 熊樱, 星元, 性欲, 性瘾, 咸鱼, 小樱, 许呦, 渲言, 昕羊, 霞雅

    所以 XY 是啥?
    wellsc
        9
    wellsc  
       2021-02-20 10:08:46 +08:00
    本身已经是个沙箱了,为啥还要细分权限
    GuuJiang
        10
    GuuJiang  
       2021-02-20 10:17:28 +08:00 via iPhone
    @ODD10 这个随便一搜都能搜到的吧?“我想要解决 X 问题,我觉得应该用 Y 这种方式,于是向别人求助 Y 应该怎么做,但是实际上想要解决 X 并不应该用 Y”
    julyclyde
        11
    julyclyde  
       2021-02-20 14:09:00 +08:00
    systemd --user

    不过觉得在 docker 里用 cron 属于需求就有问题的,不是怎么解决的问题
    Tink
        12
    Tink  
       2021-02-20 14:11:25 +08:00
    你应该考虑把 docker 以非 root 用户跑,可能还靠谱点
    mxalbert1996
        13
    mxalbert1996  
       2021-02-20 14:15:58 +08:00 via Android
    @GuuJiang @julyclyde
    最近需要用 Docker 运行 Magento,请问如果不用 cron 实现?
    https://devdocs.magento.com/guides/v2.4/config-guide/cli/config-cli-subcommands-cron.html
    binux
        14
    binux  
       2021-02-20 14:23:00 +08:00 via Android
    @ODD10 除非你 mount 了 host 的文件系统,或者 nfs,docker 里面的用户和宿主的用户没有关系。你要添加账户也要找 docker 里面添加。
    是,你可能看到 docker 用户的 UID 和宿主的重复的时候,top 出来的用户名是宿主的,但是它们真的没有什么关系,单纯就是 Linux 显示的问题。
    你 mount 了文件系统那另说。
    julyclyde
        15
    julyclyde  
       2021-02-20 14:35:54 +08:00
    @mxalbert1996 你有没有考虑过并不是所有软件都适合在容器里运行的?

    另外你也可以试试在 user 级运行 systemd.timer
    mxalbert1996
        16
    mxalbert1996  
       2021-02-20 14:46:44 +08:00 via Android
    @julyclyde 你这话可真有意思,“不适合运行在容器里”的唯一理由就是需要 cron ? docker 里又不是不能运行 cron 我为么要因为这个舍弃容器化? Magento 提供开箱即用的 cron 集成,要不你帮我写一个 systemd.timer 集成?
    BeautifulSoap
        17
    BeautifulSoap  
       2021-02-20 14:51:53 +08:00   ❤️ 1
    LZ 你这是真的想得多,查得少

    docker 内的 root 虽然和宿主的 root 是同一用户,但默认情况下 Capabilities 是极其受限的,并不具有完整的 root 权限,不能访问系统的设备等资源,只能访问容器内部的资源,且无法逃逸出容器,一般情况下根本不需要特别担心安全问题,如果担心,可以将 docker 的默认启动用户从 root 换成普通用户

    并且 docker 支持 user namespace,LZ 你如果追求绝对的安全,配置 user namespace 才是解决你安全顾虑的方法,你纠结容器内非 root 用户是找错方向了
    https://docs.docker.com/engine/security/userns-remap/
    ODD10
        18
    ODD10  
    OP
       2021-02-20 14:55:48 +08:00 via iPhone
    @binux #14
    肯定挂载了文件呐
    UID 不一样,就没权限读写之类
    所以我在宿主机修改文件用户权限
    ODD10
        19
    ODD10  
    OP
       2021-02-20 14:59:15 +08:00 via iPhone
    @BeautifulSoap #17
    我用过这个,Portainer 就没办法工作了,又多一个坑,还得加 host 排除。
    我就想知道有什么好办法玩 cron
    BeautifulSoap
        20
    BeautifulSoap  
       2021-02-20 15:46:32 +08:00
    @ODD10 请: https://github.com/portainer/portainer/issues/662

    总结:cron 直接 root 跑
    ODD10
        21
    ODD10  
    OP
       2021-02-20 16:31:37 +08:00 via iPhone
    @BeautifulSoap #20
    这个中午看过,那些方案都没试;我直接关了 namespase 。
    能用普通用户的用普通用户,然后全上 cap_drop ALL
    julyclyde
        22
    julyclyde  
       2021-02-20 16:47:06 +08:00
    @mxalbert1996 不适合在容器里有各种原因,cron 是其中之一。你这么坚定就慢慢搞呗,反正麻烦的不是我
    BeautifulSoap
        23
    BeautifulSoap  
       2021-02-20 16:49:06 +08:00 via Android
    @ODD10 那么恭喜你你有可能发现了 Portainer 一个 bug,要么自己看 log 查找 bug 原因上报,要么去 GitHub 发 issue 求助

    虽然不知道你打算怎么用 docker,使用 docke 内的 root 用户不会有大安全问题(比谁都注重安全的基于 docker 的各种云服务都能跑 root 用户要不安全早爆炸了),你既然如此顾虑不太着边际的安全问题的话就应该尽量想办法解决 user namespace 问题
    emeab
        24
    emeab  
       2021-02-20 16:53:31 +08:00
    @ODD10 docker in docker.
    mxalbert1996
        25
    mxalbert1996  
       2021-02-20 19:36:17 +08:00 via Android
    @julyclyde 哈哈哈,docker 里运行 cron 只要一条命令就够了你居然说麻烦,真是笑死我了。另外关于不适合容器的原因我倒是想听听你的高见。
    fatelight
        26
    fatelight  
       2021-03-15 04:18:09 +08:00
    CMD [ "crond" ]
    dzdh
        27
    dzdh  
       2021-03-29 19:33:58 +08:00
    @BeautifulSoap 像 es 这种应用就是不允许使用 root 用户跑,拒绝被执行的呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5201 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:42 · PVG 13:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.