You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决Alpine Docker容器中从root切换非root用户失败的问题

Alpine容器中从root切换至非root用户的解决方法

背景重现

编写的Dockerfile

FROM python:3.10-alpine

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set arguments
ARG USERNAME=jpg
ARG USER_DIR=/home/$USERNAME
ARG WORK_DIR=$USER_DIR/app

# Creating a non-root user
RUN adduser -S $USERNAME

# Switching the user
USER $USERNAME

# Create a new directory to keep the project files
RUN mkdir $WORK_DIR

# Copy local contents into container
COPY ./ $WORK_DIR

# Setting newly created directory as PWD
WORKDIR $WORK_DIR

# Adding user's bin path to `PATH` variable
ENV PATH "$PATH:$USER_DIR/.local/bin"

# Installing pip packages
RUN pip install pip -U

构建与运行镜像

构建命令:

docker build . -t test-img:latest

运行镜像进入Python交互式shell:

docker run -i -t test-img:latest python

验证当前用户为jpg:

Python 3.10.10 (main, Mar 14 2023, 03:01:12) [GCC 12.2.1 20220924] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import getpass
>>> getpass.getuser()
'jpg'
>>> 

遇到的问题

以root身份exec进入容器后,尝试切换到jpg用户失败:

$ docker exec -it -u root f6dc515bca29 sh                                                                                                                               
/home/jpg/app # su - jpg
This account is not available
/home/jpg/app # su - "jpg"
This account is not available
/home/jpg/app # su -l "jpg"
This account is not available
/home/jpg/app # su -l jpg
This account is not available
/home/jpg/app # 

问题

如何在Alpine系统的容器中从root用户切换至jpg(或任意非root用户)?

注意:必须以root身份登录exec会话,以此模拟AWS Fargate容器的场景。

解决办法

原因分析

使用adduser -S创建的是系统用户,这类用户默认没有可登录的shell(shell字段为/sbin/nologin),而su -或su -l命令要求用户拥有可登录shell,因此会触发"This account is not available"错误。

方案1:创建用户时指定登录shell

修改Dockerfile中创建用户的命令,添加-s /bin/sh参数指定登录shell:

RUN adduser -S $USERNAME -s /bin/sh

重新构建镜像后,即可正常使用su - jpg或su -l jpg切换用户,同时会加载用户的环境变量。

方案2:不使用登录shell直接切换

如果不想修改Dockerfile,直接使用不带-或-l参数的su命令,即可切换到目标用户身份(不会加载登录环境变量):

su jpg

执行后用whoami验证:

whoami
# 输出:jpg

如果需要切换后加载用户的环境变量,可以手动指定shell执行:

su -s /bin/sh jpg

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:05:29