VSCode使用Remote-Containers连接Django容器新建文件属主为root问题咨询
可以通过新增.devcontainer目录下的Dockerfile解决该问题。
你之前直接在docker-compose中指定user: 1000:1000报错,是因为原镜像中不存在UID为1000的用户,且原镜像中Python依赖目录、项目运行目录的权限都归root所有,非root用户没有访问权限导致的。具体配置步骤如下:
步骤1:新增.devcontainer/Dockerfile
该文件基于原项目的Django镜像做扩展,无需修改原项目任何基础配置:
# 替换为你原项目Django服务使用的镜像名,比如原Dockerfile构建出的镜像名或基础镜像名 FROM your-original-django-image:latest # 配置用户参数,默认UID/GID为1000,匹配绝大多数Linux、WSL2、MacOS的本地用户ID ARG USER_ID=1000 ARG GROUP_ID=1000 ARG USERNAME=devuser # 安装sudo,方便容器内临时提权安装依赖,可根据需要省略 RUN apt-get update && apt-get install -y --no-install-recommends sudo \ && rm -rf /var/lib/apt/lists/* # 创建和宿主机UID/GID匹配的非root用户 RUN groupadd --gid ${GROUP_ID} ${USERNAME} \ && useradd --uid ${USER_ID} --gid ${GROUP_ID} -m ${USERNAME} \ # 配置sudo免密权限 && echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/${USERNAME} \ && chmod 0440 /etc/sudoers.d/${USERNAME} # 给非root用户开放原镜像中root所有的必要目录权限,根据你的项目实际路径调整 RUN chown -R ${USERNAME}:${USERNAME} \ /usr/local/lib/python* \ /usr/local/bin \ /workspace \ # 如果项目有其他需要写入权限的目录,比如日志、静态文件、媒体文件目录,可以继续追加 /path/to/your/project/logs \ /path/to/your/project/static \ /path/to/your/project/media # 切换为非root用户启动 USER ${USERNAME}
步骤2:修改.devcontainer/docker-compose.yml
启用自定义构建配置,无需修改项目根目录的docker-compose.yml:
version: '3.0' services: django: # 启用自定义Dockerfile构建 build: context: . dockerfile: .devcontainer/Dockerfile args: # 也可以从宿主机环境变量读取,适配不同用户的UID/GID USER_ID: ${HOST_USER_ID:-1000} GROUP_ID: ${HOST_GROUP_ID:-1000} volumes: - .:/workspace command: /bin/sh -c "while sleep 1000; do :; done"
步骤3:重启开发容器
在VSCode中执行Remote-Containers: Rebuild Container,重建完成后:
- 容器内默认运行用户为UID=1000的非root用户
- 新建的文件在宿主机上的属主为本地用户,不会出现root权限问题
- 原Django项目的运行、依赖安装都不会有权限报错
内容的提问来源于stack exchange,提问作者Johnny Beltran
相关产品推荐
相关产品推荐

