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

39

我正在尝试在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。

10个回答

73

Ubuntu 21.04

我在这里搜索PermissionError: [Errno 13] Permission denied:,所以我会在这里留下这个。

注意:以下答案不适用于多用户系统...查看此答案以获取另一个可能的解决方案


如果您想为一个用户设置并忘记,即您自己的用户...这是我在我的开发机器上所拥有的内容。
我没有拥有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

再来一个不那么hacky的解决方案:https://dev59.com/Y1MI5IYBdhLWcg3wNIog#70124863

WSL(NevilleLusimba)注意事项

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

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

并且给予Docker读写权限

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

通过WSL在Ubuntu 22.04 LTS上对我有用


2
没有其他方法对我有用,感谢你列出来! - ViaTech
2
10颗星,解决了我的问题。 - ervinbosenbacher
1
无法在多用户系统上执行此操作。最好将自己添加到 docker 用户组中。 - Shōgun8
@Shōgun8 可能将多个用户添加到 docker 组中,参见:https://dev59.com/Y1MI5IYBdhLWcg3wNIog#70124863,而不是对 systemd sockets.target 进行更改。 - jmunsch
@jmunsch - 我不确定你是否理解了我的评论。我建议将self添加到docker组,因为您不能有多个用户chowning文件,例如chown $(whoami) - Shōgun8
显示剩余3条评论

18

在你的 dockerfile 中,你指定了一个新用户 dockuser

RUN adduser -D dockuser
USER dockuser
因此,您的容器将以用户dockuser启动,该用户似乎没有适当的权限来运行/manage.py
您可以选择要么删除上述提到的创建和指向dockuser的行,要么为/manage.py文件在dockerfile中使用chownchmod命令为用户dockuser提供适当的权限。
我曾在这里回答过类似的问题。

删除Docker用户解决了我在AWS EFS / Fargate中的权限被拒绝问题。 - Vijay Anand Pandian

13

我曾经遇到同样的问题,通过将我的用户加入 docker 组来解决:

$ sudo usermod -aG docker $(whoami)

9
注意:这将不会在您当前的会话中生效 - 您需要重新登录。 翻译:请注意:这个更改 不会 立即生效,您需要重新登录才能生效。 - panepeter

6
RUN adduser -D dockuser之后,将以下内容添加到您的Dockerfile中:
RUN chown dockuser:dockuser -R /app/

如果你已经挂载了文件,为什么还要复制它们?

如果你希望保留挂载,你需要在主机系统上为文件夹添加rw权限,而不是在容器中添加。


Step 11/11 : RUN chown user:user -R /app/ ---> Running in 4692ee51488d chown: /app/: Operation not permitted chown: /app/: Operation not permitted The command '/bin/sh -c chown user:user -R /app/' returned a non-zero code: 1 - Pran Kumar Sarkar
是的,更改文件夹的 CHOWN 权限解决了问题。 - Ebram Shehata
1
@PranKumarSarkar,在USER user行之前你必须完成它。 - Muhammad Usman

4

如果你使用的是Mac电脑,这个方法可能对你有用。

在经过4天的故障排查后(还有其他奇怪的错误),我发现需要在我的文件系统中修复Docker的权限。要做到这一点,请执行以下步骤:

系统偏好设置 -> 安全性与隐私 -> 隐私选项卡 -> 全磁盘访问(在左侧列表的某处) -> 单击“+” -> Docker 应用程序

这是一个非常令人沮丧的问题,但希望这能帮到你。


2
这是非常重要的 - 将很可能成为许多人的巨大问题。 - Scott Stoltzman
3
如何在Ubuntu或Windows上执行此操作?我遇到了同样的错误。 - Development FlazHost
1
这篇文章值得更多的点赞。真的真的救了我的一天。谢谢你,伙计!!! - waqasgard

1
我使用的Dockerfile位于虚拟机(VirtualBox)的共享目录中。因此,我的问题与该目录的默认权限有关(UID=root,GID=vboxdf)。我必须将其更改为当前用户才能正确运行容器。
请参见https://superuser.com/a/640028/1655184,了解如何更改所有者的说明。

0
我遇到了类似的问题,问题是我正在运行docker-desktop。解决办法是退出docker-desktop。 操作系统:Ubuntu 20.04LTS
退出后重新构建和运行命令。

0

对于Ubuntu系统,只需在命令前加上sudo并以root身份运行即可获得权限。

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


0
在docker-compose中添加类似于'/home/user/app:/app'的路径,而不是只有'.:/app',解决了我的问题。

0
对我来说,这是Windows上WSL2 / Docker-Desktop设置问题。
缺少的是明确启用WSL发行版:Docker Desktp Settings>资源>WSL集成>启用您的发行版
然后重新打开WSL shell。
之前,我甚至无法运行docker run hello-world,但在运行docker-compose时也遇到了与OP非常相似的错误消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接