Docker容器结合SLURM作业的root权限配置问题求助
解决SLURM作业访问Docker容器时的sudo权限问题
当前Docker容器中创建了普通用户并配置了sudo权限,但SLURM作业执行sudo命令时会卡在输入密码的步骤。以下是两种针对性解决方案:
方案一:Dockerfile直接以root用户运行
该方案无需处理sudo权限,直接用root操作,适合频繁需要root权限的场景。
修改Dockerfile
移除创建普通用户、设置密码、加入sudo组及切换用户的相关指令,保留基础环境配置即可:
FROM nvidia/cuda:12.2.0-devel-ubuntu22.04 # 设置非交互式apt安装环境变量 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y wget bzip2 && apt-get clean && rm -rf /var/lib/apt/lists/* RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && bash /tmp/miniconda.sh -b -p /opt/miniconda && rm /tmp/miniconda.sh ENV PATH=/opt/miniconda/bin:$PATH # 更新包列表并安装依赖 RUN apt-get update && apt-get install -y \ python3 \ python3-pip \ build-essential \ gcc \ g++ \ openmpi-bin \ openmpi-common \ libopenmpi-dev # 安装NumPy和SciPy RUN pip3 install numpy scipy # 直接以root用户运行,设置工作目录 WORKDIR /raid/cedsan/new_docker/
修改SLURM脚本
移除--user $(id -u $USER):$(id -g $USER)参数,默认以root进入容器执行命令(无需sudo):
docker run -t --gpus '"device='$CUDA_VISIBLE_DEVICES'"' --name $SLURM_JOB_ID --ipc=host --shm-size=20GB -v /raid/cedsan/new_docker pymatgen_cuda bash -c "apt-get update" | tee -a log_out.txt
方案二:配置普通用户免密sudo或自动输入密码
若必须保留普通用户,可通过以下两种方式跳过sudo密码验证:
子方案2.1:Dockerfile中配置免密sudo
在Dockerfile的usermod -aG sudo $dockerusername之后添加以下指令,让cedsan用户无需密码执行所有sudo命令:
# 配置免密sudo规则 RUN echo "$dockerusername ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$dockerusername # 设置sudoers文件权限(必须为0440) RUN chmod 0440 /etc/sudoers.d/$dockerusername
修改后SLURM脚本中的sudo命令会自动执行,无需输入密码。
子方案2.2:SLURM脚本中自动传递密码
通过管道将预设密码传递给sudo,确保密码与Dockerfile中dockeruserpassword一致:
docker run -t --gpus '"device='$CUDA_VISIBLE_DEVICES'"' --name $SLURM_JOB_ID --ipc=host --shm-size=20GB --user $(id -u $USER):$(id -g $USER) -v /raid/cedsan/new_docker pymatgen_cuda bash -c "echo 'password' | sudo -S apt-get update" | tee -a log_out.txt
内容的提问来源于stack exchange,提问作者sourav guha
相关产品推荐
相关产品推荐

