Docker部署Django项目创建app后文件权限不足问题求助
解决Docker Compose创建Django应用后目录权限问题
问题根源
docker compose run默认以容器内的root用户执行命令,所以新建的auth/目录和文件会属于宿主机的root用户。你加入docker组只是获得了运行Docker命令的权限,和容器内创建的文件权限无关;之前sudo chown meeee:docker auth/无效,大概率是没加递归参数(-R),但这只是临时补救办法。
永久解决方法(推荐)
1. 修改Dockerfile,创建与宿主机匹配的非root用户
在项目的Dockerfile中添加以下内容,让容器以和你宿主机用户UID/GID一致的身份运行:
# 定义默认UID/GID,普通用户常用值为1000 ARG UID=1000 ARG GID=1000 # 创建对应权限的用户组和用户 RUN groupadd -g ${GID} django_group && \ useradd -u ${UID} -g ${GID} -m django_user # 切换到该用户执行后续命令 USER django_user
2. 在docker-compose.yml中传递宿主机UID/GID
在services.web配置块中添加构建参数,把你当前用户的UID和GID传给容器构建过程:
services: web: build: context: . args: - UID=${UID} - GID=${GID} # 保留原有其他配置...
这样构建完成后,容器内的用户权限和你宿主机完全匹配,以后用docker compose run创建的文件会直接属于你,无需再手动修改权限。
临时快速解决方法
如果不想调整Docker配置,每次执行创建命令时直接指定容器用你当前用户的UID/GID运行:
docker compose run --user $(id -u):$(id -g) web django-admin startapp auth
$(id -u)和$(id -g)会自动获取你当前用户的UID和GID,容器内以这个身份执行命令,创建的文件权限自然和你一致。
补充说明
之前的sudo chown meeee:docker auth/无法彻底解决问题,一是没递归修改目录内文件,二是docker组权限不影响文件的读写权限,正确的临时修改命令应该是sudo chown -R meeee:meeee auth/,但显然这种重复操作效率低下,上面的永久方案能彻底解决每次新建目录都要改权限的麻烦。
内容的提问来源于stack exchange,提问作者Ambassador Kosh
相关产品推荐
相关产品推荐

