权限错误:[Errno 13]权限被拒绝:'/manage.py'

问题描述 投票:0回答:11

我正在尝试在

docker-composer
中运行以下命令,以使用
django-admin
启动项目:

docker-compose run app sh -c "django-admin startproject app ."

这会产生错误:

    Traceback (most recent call last):
  File "/usr/local/bin/django-admin", line 10, in <module>
    sys.exit(execute_from_command_line())
  File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.7/site-packages/django/core/management/commands/startproject.py", line 20, in handle
    super().handle('project', project_name, target, **options)
  File "/usr/local/lib/python3.7/site-packages/django/core/management/templates.py", line 155, in handle
    with open(new_path, 'w', encoding='utf-8') as new_file:
PermissionError: [Errno 13] Permission denied: '/manage.py'

Dockerfile如下:

FROM python:3.7-alpine
MAINTAINER anubrij chandra

ENV PYTHONUNBUFFERED 1

COPY ./requirements.txt /requirements.txt

RUN pip install -r /requirements.txt

RUN mkdir /app
COPY ./app /app



RUN adduser -D dockuser
USER dockuser

我的

docker-compose.yml

version: "3"

services:
  app:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000"

我应用了这个 Stack Overflow 线程中建议的解决方案,但它不起作用。

我使用的是 Ubuntu 18.04。

python django docker docker-compose django-admin
11个回答
73
投票

ubuntu 21.04

我来这里寻找

PermissionError: [Errno 13] Permission denied:
所以我就把它留在这里。

注意:以下答案不适用于多用户系统...请参阅此答案以获取另一种可能的解决方案


如果您想设置它并忘记 1 个用户(您自己的用户)...这是我的开发计算机上的内容。

我没有 unix 套接字,所以我把它搞砸了。 (这立刻就可以工作了)

sudo chown $(whoami):$(whoami) /var/run/docker.sock

针对您的开发环境的另一个更永久的解决方案是修改 unix 套接字创建的用户所有权。这将为您的用户提供所有权,因此它将在重新启动之间保持不变:

sudo nano /etc/systemd/system/sockets.target.wants/docker.socket

docker.socket:

[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=YOUR_USERNAME_HERE
SocketGroup=docker

[Install]
WantedBy=sockets.target

又一个不那么麻烦的解决方案:https://stackoverflow.com/a/70124863/2026508

WSL(NevilleLusimba)注意事项

可能还想将目录/应用程序所有权更改为 docker

$ sudo chgrp -R docker /path/to/directory 

并授予对 docker 的读写访问权限

$sudo chmod -R g+rw /path/to/directory 

通过 WSL 在 Ubuntu 22.04 LTS 上为我工作


19
投票

在您的

dockerfile
中,您指向一个新用户
dockuser

RUN adduser -D dockuser
USER dockuser

因此,您的容器将以用户

dockuser
启动,该用户似乎没有适当的权限来运行
/manage.py

你可以

  • 删除上面提到的您创建并指向的行
    dockuser

  • 在 /manage.py 文件的 dockerfile 中使用
    dockuser
    chown
    命令为用户
    chmod
    提供适当的权限。

我已经回答过类似的问题here


14
投票

我遇到了同样的问题,并通过将我的用户添加到

docker
组来解决它:

$ sudo usermod -aG docker $(whoami)

7
投票

将此添加到您的

Dockerfile
之后
RUN adduser -D dockuser
:

RUN chown dockuser:dockuser -R /app/

如果您已经安装了这些文件,为什么还要

COPY
这些文件?

如果要保留挂载,需要在

rw
系统上而不是
HOST
上的文件夹上添加
Container

权限

4
投票

如果您使用的是 Mac,这可能适合您。

经过 4 天的时间排查此错误(以及其他奇怪的错误)后,我发现我需要修复文件系统中的 docker 权限。要执行此操作,请访问:

系统偏好设置 -> 安全和隐私 -> 隐私选项卡 -> 完整磁盘访问(左侧,列表中的某处) -> 单击 + -> Docker 应用程序

调试非常令人沮丧的问题,希望有帮助。


1
投票

我使用的 Dockerfile 位于我的虚拟机 (VirtualBox) 的共享目录中。因此,我的问题与该目录的默认权限(UID=root,GID=vboxdf)有关。我必须将其更改为当前用户才能正确运行我的容器。

有关如何更改所有者的说明,请参阅 https://superuser.com/a/640028/1655184


0
投票

对我来说,这是 Windows 上的 WSL2 / Docker-Desktop 设置问题。

缺少的是显式启用 WSL 发行版:Docker Desktp 设置 > 资源 > WSL 集成 > 启用您的发行版

然后重新打开 WSL shell。

之前我什至无法做到

docker run hello-world
,但在运行 docker-compose 时也有与 OP 非常相似的错误消息。


0
投票

在 docker-compose 中添加应用程序的路径,例如“/home/user/app:/app”,而不仅仅是“.:/app”,解决了我的问题


0
投票

对于 ubuntu,只需在命令中添加 sudo 并以 root 身份运行即可获取权限。

sudo docker-compose run app sh -c "django-admin startproject app ."


0
投票

我遇到了类似的问题,问题是我运行 docker-desktop。解决方案是退出 docker-desktop。 操作系统:Ubuntu 20.04LTS

退出后重新构建并重新运行命令。


0
投票

对我来说 Docker Desktop 有效的解决方案是将相关项目目录添加到“虚拟文件共享”中,方法如下:

Docker Desktop
->
Settings
(齿轮图标)->
Resources
->
File sharing
(子菜单)-> 将
<path>/<to>/<project-directory>
添加到列表
virtual file shares

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.