Docker中使用su - www-data与sudo -u www-data切换用户有什么区别?
二者在Docker容器内切换非root用户执行命令的具体差异
- 环境变量处理差异
su默认继承当前root用户的几乎全部环境变量,仅做极少的初始化调整,不会主动加载目标用户的.profile、.bashrc等配置,除非显式添加-l/--login参数。sudo默认会重置绝大多数环境变量,仅保留安全白名单内的变量(比如PATH会替换为sudo配置里的安全路径),如果要保留当前环境需要额外加-E/--preserve-env参数。
- 权限校验逻辑差异
su从root用户切换到任意用户都不需要输入密码,完全没有额外的权限校验逻辑,适配性更强。sudo即使是root用户执行,也依赖sudoers配置的权限规则,虽然绝大多数发行版默认给root开放了全部sudo权限,但如果自定义修改过sudoers配置就可能执行失败;如果是从非root身份执行sudo切换用户,还需要额外配置NOPASSWD规则才能免密运行,适配成本更高。
- 信号透传表现差异
su执行命令时会先启动su父进程,再fork出指定shell和业务进程,默认不会把容器发送的SIGTERM等信号透传到业务进程,容易出现docker stop超时10秒才强制销毁的问题,需要额外用exec或者--session-command参数优化。sudo默认同样存在信号透传问题,但多数发行版的sudo支持--foreground参数让业务进程直接接管前台运行,信号透传的适配成本更低。
- 默认依赖与体积差异
你已知的Alpine镜像默认未预装sudo,需要手动执行apk add sudo安装,会增加几MB的镜像体积;而su属于shadow工具包组件,所有Linux镜像(包括Alpine)默认预装,不需要额外依赖,更适合最小化镜像场景。 - 参数规则与容错差异
su执行多参数命令时必须用-c参数包裹整段命令串,且由于www-data这类服务用户默认shell是/usr/sbin/nologin,必须加-s指定合法shell才能运行,否则直接报错。sudo不需要显式指定shell,会自动分配可用shell执行命令,且命令不需要整段包裹引号,直接写sudo -u www-data /usr/local/bin/php xxx即可,误写概率更低。
内容的提问来源于stack exchange,提问作者Qiulang
相关产品推荐
相关产品推荐

