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

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
    

问题根源

  1. 权限配置错误:
    • Dockerfile中chown命令的组名写错(uexample-user应为example-user)
    • 项目文件复制操作在创建用户之前执行,导致文件/目录归属为root,自定义用户无写入权限
    • static目录下的子目录(如admin)仍属于root,collectstatic无法修改
  2. 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 . .

验证步骤

  1. 重新构建镜像:docker-compose build
  2. 启动容器:docker-compose up -d
  3. 执行collectstatic:docker-compose exec web python manage.py collectstatic --noinput
  4. 检查目录权限:docker-compose exec web ls -l /code/static,确认所有子目录归属为example-user

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:47:03