以非root用户运行Docker时Bash终端异常问题求助
解决Docker非root用户终端提示符异常与Tab补全失效问题
问题现象
使用Bash运行Docker容器时,root用户终端显示正常;切换为非root用户后,终端仅显示$符号,Tab补全功能失效,切换不同目录后提示符仍保持$不变。
原配置文件
Dockerfile
FROM python:3.10 # Create non-root user RUN groupadd -r dsteam && useradd -r -g dsteam -m dsteam # Set the working directory WORKDIR /home/dsteam/app/ # Copy and install requirements COPY ./requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Change directory ownership RUN chown -R dsteam:dsteam /home/dsteam/app # Expose the port EXPOSE 5001 # Switch to non-root user USER dsteam # Copy the rest of the application code COPY . . # Run your command # CMD [ "uvicorn", "src.server.app:app", "--host", "0.0.0.0", "--port", "80", "--reload" ]
docker-compose.yml
version: '3' services: aiproject: build: . image: aiproject-image container_name: aiproject-container ports: - "80:80" volumes: - .:/app stdin_open: true tty: true # Override the default command with bash command: ["bash"]
解决方案
问题根源是非root用户未加载bash的环境配置文件,导致提示符规则和Tab补全功能未启用。同时挂载目录路径不匹配引发权限问题,进一步影响环境初始化。以下是修改后的配置:
修改后的Dockerfile
FROM python:3.10 # Create non-root user RUN groupadd -r dsteam && useradd -r -g dsteam -m dsteam # 复制root用户的bash配置到非root用户家目录,确保环境正常 RUN cp /root/.bashrc /home/dsteam/ && \ cp /root/.bash_profile /home/dsteam/ && \ chown dsteam:dsteam /home/dsteam/.bashrc /home/dsteam/.bash_profile # Set the working directory WORKDIR /home/dsteam/app/ # Copy and install requirements COPY ./requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Change directory ownership RUN chown -R dsteam:dsteam /home/dsteam/app # Expose the port EXPOSE 5001 # Switch to non-root user USER dsteam # Copy the rest of the application code COPY . . # Run your command # CMD [ "uvicorn", "src.server.app:app", "--host", "0.0.0.0", "--port", "80", "--reload" ]
修改后的docker-compose.yml
version: '3' services: aiproject: build: . image: aiproject-image container_name: aiproject-container ports: - "80:80" # 挂载到非root用户的工作目录,匹配Dockerfile设置 volumes: - .:/home/dsteam/app stdin_open: true tty: true # Override the default command with bash command: ["bash"]
修改说明
- Dockerfile修改:复制root用户的
.bashrc和.bash_profile到非root用户家目录并修改所有权,确保bash启动时加载配置,恢复用户名、主机名、当前路径的提示符格式,同时启用Tab补全功能。 - docker-compose.yml修改:调整挂载目录为
/home/dsteam/app,与Dockerfile中设置的工作目录保持一致,避免挂载时覆盖非root用户的权限配置,保证代码挂载同步的同时环境正常初始化。
内容的提问来源于stack exchange,提问作者rcr_aagr
相关产品推荐
相关产品推荐

