Docker自定义Debian镜像chsh执行失败及sudo免密配置问题
问题1:成功执行RUN chsh -s /bin/bash ${USERNAME}的解决方案
报错的核心原因是自定义基础镜像
some-debian-image将root用户的默认shell设置为了/usr/sbin/nologin,且系统PAM策略对chsh命令启用了身份校验,Docker构建的非交互环境无法输入密码,因此触发认证失败。上游Debian官方镜像默认root的shell为/bin/bash,且PAM策略未对root执行chsh做额外校验,因此不会报错。
- 方案1(最推荐):使用
usermod命令绕开chsh的PAM校验,直接修改用户shell
把Dockerfile中的对应RUN指令替换为:
root身份下执行RUN usermod -s /bin/bash rootusermod无需额外身份验证,适配性更高。 - 方案2:直接修改
/etc/passwd文件替换root的shell配置
直接操作配置文件,完全不会触发PAM校验逻辑。RUN sed -i 's#^root:x:0:0:root:/root:/usr/sbin/nologin$#root:x:0:0:root:/root:/bin/bash#' /etc/passwd - 方案3:临时修改PAM策略后执行
chsh
如果必须保留chsh命令的写法,可以临时放开PAM对chsh的校验:RUN sed -i '1 i auth sufficient pam_permit.so' /etc/pam.d/chsh && chsh -s /bin/bash root
问题2:配置sudo su免密的方法
sudo的免密规则可以通过修改sudoers配置实现,操作步骤如下:
- 首先确保镜像中已安装
sudo工具,未安装的话先执行安装:RUN apt update && apt install -y sudo - 添加免密配置,推荐写入单独的配置文件避免修改主配置出错:
- 如果是给root用户配置所有sudo操作免密:
RUN echo "root ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/root-nopasswd && chmod 0440 /etc/sudoers.d/root-nopasswd - 如果是给普通用户(示例用户名
myuser)配置所有sudo操作免密:RUN echo "myuser ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/myuser-nopasswd && chmod 0440 /etc/sudoers.d/myuser-nopasswd
sudo su或者其他sudo前缀的命令都不需要输入密码。 - 如果是给root用户配置所有sudo操作免密:
内容的提问来源于stack exchange,提问作者Pravin.2087
相关产品推荐
相关产品推荐

