解决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
相关产品推荐
相关产品推荐

