You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何创建以具备sudo权限的普通用户启动的Ubuntu Docker容器并解决权限问题

解决Ubuntu容器中普通用户无需sudo执行命令的问题

我看了你的Dockerfile,问题主要出在几个细节上——比如用户创建的参数、sudo权限配置,还有环境变量的时机,导致你每次都得加sudo,进而带来权限混乱。咱们一步步改过来:

问题分析

  1. 你用了useradd -r,这个参数是创建系统用户(UID通常小于1000),这类用户默认不适合交互式使用,而且你指定了/sbin/nologin作为shell,这会导致用户没法正常登录执行命令。
  2. chown -R nick:nick $HOME这一步有问题:在RUN指令里,$HOME默认是root用户的主目录(/root),所以你根本没改到/home/nick的权限。
  3. 没有配置无密码sudo,就算用户在sudo组里,每次执行sudo都得输密码,既麻烦又会让脚本执行时出错,而且用sudo创建的文件所有权会变成root,这就是你遇到的权限问题根源。

修改后的Dockerfile

FROM ubuntu:20.04

# 先更新系统并安装sudo,避免后续依赖问题
RUN apt-get update && apt-get install -y sudo && rm -rf /var/lib/apt/lists/*

# 创建普通用户nick:-m自动创建主目录,-s指定交互式shell,不用-r(系统用户)
RUN useradd -m -s /bin/bash -c "Docker image user" nick

# 将用户加入sudo组
RUN usermod -aG sudo nick

# 配置nick用户无需密码执行sudo(关键!)
RUN echo "nick ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/nick

# 设置用户密码(可选,如果你需要登录验证的话)
RUN echo "nick:yourpassword" | chpasswd

# 设置环境变量和工作目录
ENV HOME=/home/nick
WORKDIR $HOME

# 切换到nick用户启动容器
USER nick

关键改动说明

  • 去掉useradd -r,改用-m自动创建主目录,指定/bin/bash作为shell,确保用户能正常交互式操作。
  • 新增sudoers.d配置文件,给nick用户无密码sudo权限,这样执行需要root权限的命令时,要么直接用sudo不用输密码,要么如果是脚本里的命令,也能顺畅执行,不会因为权限卡住。
  • 先安装sudo再配置用户,避免依赖缺失。
  • 修正了主目录权限:因为useradd -m已经自动创建了属于nick的主目录,所以不需要额外chown了。

验证方法

构建镜像后运行容器:

docker build -t ubuntu-nick .
docker run -it ubuntu-nick

在容器里试试执行需要root权限的命令,比如sudo apt update,不用输密码就能执行;创建文件touch test.txt,查看权限会是nick:nick,不会出现root所有权的问题,完美模拟干净的普通用户环境。

内容的提问来源于stack exchange,提问作者nick

火山引擎 最新活动