Dockerfile切换自定义用户:解决Django权限及构建警告
解决Django+Docker中的权限拒绝与非root用户配置问题
问题概述
- 运行
collectstatic时出现权限拒绝错误:[Errno 13] Permission denied: '/code/static/admin/js/vendor/select2/i18n/pl.6031b4f16452.js.gz'
- 切换自定义非root用户后,Docker构建时出现脚本路径警告(如gunicorn、django-admin等不在PATH中)
- 容器内
/code/static目录权限情况:total 16 drwxrwxrwx 1 root root 4096 Apr 5 05:42 admin drwxrwxrwx 1 root root 4096 Sep 18 21:21 css drwxrwxrwx 1 root root 4096 Sep 18 21:21 human drwxrwxrwx 1 root root 4096 Sep 18 18:42 img -rw-r--r-- 1 1234 1234 13091 Sep 18 21:21 staticfiles.json drwxrwxrwx 1 root root 4096 Sep 18 21:21 transcribe
问题根源
- 权限配置错误:
- Dockerfile中
chown命令的组名写错(uexample-user应为example-user) - 项目文件复制操作在创建用户之前执行,导致文件/目录归属为root,自定义用户无写入权限
static目录下的子目录(如admin)仍属于root,collectstatic无法修改
- Dockerfile中
- PATH未配置:非root用户下pip安装的脚本默认放在
~/.local/bin,未被加入系统PATH,导致构建警告
修复方案
1. 调整Dockerfile执行顺序与权限设置
- 先创建自定义用户,再设置工作目录
- 提前创建
media和static目录并修改归属,确保后续操作有权限 - 修正
chown命令的组名错误
2. 添加用户本地bin目录到PATH
- 在Dockerfile中添加环境变量,将
/home/example-user/.local/bin加入系统PATH
修正后的完整Dockerfile
# Pull base image FROM python:3.11.4-slim-bullseye # Set environment variables ENV PIP_NO_CACHE_DIR off ENV PIP_DISABLE_PIP_VERSION_CHECK 1 ENV PYTHONUNBUFFERED 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV COLUMNS 80 # Install Debian dependencies RUN apt-get update \ && apt-get install -y --force-yes python3-pip ffmpeg git libmagic-dev libpq-dev gcc \ && rm -rf /var/lib/apt/lists/* # Create custom non-root user RUN useradd -m example-user # Add user's local bin to PATH to avoid pip script warnings ENV PATH="/home/example-user/.local/bin:$PATH" # Set working directory WORKDIR /code/ # Create and set permissions for media/static directories RUN mkdir -p /code/media /code/static \ && chown -R example-user:example-user /code/media /code/static /code/ # Switch to non-root user early to avoid root-owned files USER example-user # Install Python dependencies (will go to ~/.local/bin) COPY requirements.txt . RUN pip install -r requirements.txt # Copy project files (now owned by example-user due to WORKDIR permission) COPY --chown=example-user:example-user . .
验证步骤
- 重新构建镜像:
docker-compose build - 启动容器:
docker-compose up -d - 执行
collectstatic:docker-compose exec web python manage.py collectstatic --noinput - 检查目录权限:
docker-compose exec web ls -l /code/static,确认所有子目录归属为example-user
内容的提问来源于stack exchange,提问作者tthheemmaannii
相关产品推荐
相关产品推荐

