权限被拒绝,无法打开静态文件,Docker,Django

Posted

技术标签:

【中文标题】权限被拒绝,无法打开静态文件,Docker,Django【英文标题】:Permission denied, cannot open static files, Docker, Django 【发布时间】:2021-06-22 04:28:15 【问题描述】:

我是 docker 新手,我想将我的 django 应用程序 dockerize 到生产环境中。 我的操作系统:Ubuntu 20.04.1 LTS, Docker 版本 20.10.5,构建 55c4c88, 我的 docker-compose.yml 文件如下:

version: '3.1'

services: 
    nginx-proxy:
        image: jwilder/nginx-proxy
        restart: "always"
        ports:
            - "80:80"
        volumes:
            - /var/run/docker.sock:/tmp/docker.sock:ro
            - ./nginx/vhost/:/etc/nginx/vhost.d:ro
            - ./nginx/conf.d/client_max_body_size.conf:/etc/nginx/conf.d/client_max_body_size.conf:ro
            - ./static/:/amd/static
            - ./media/:/amd/media
    postgres:
        image: postgres:9.6.6
        restart: always
        volumes:
            - ./pgdb/:/var/lib/postgresql/
        ports:
            - "5432:5432"
        env_file: ./.env

    redis:
        image: redis
        ports:
            - 6379:6379
        restart: always


    web:
        container_name: amd
        build: .
        restart: "always"
        ports:
            - "8000:8000"
        volumes:
            - .:/code/ 
            # - ./static/:/code/static
            # - ./media/:/code/media
        depends_on:
            - "postgres"
        env_file: .env

    celery:
        build:
            context: .
            dockerfile: celery.dockerfile
        volumes:
            - .:/code
        command: celery -A amdtelecom worker -l info   
        links:
            - redis
            - postgres
        depends_on:
            - "redis"
            - "postgres"
        env_file: ./.env

networks:
    default:
        external:
            name: nginx-proxy

我的 Dockerfile 如下:

FROM python:3.7

ENV PYTHONUNBUFFERED 1
ENV DEBUG False

COPY requirements.txt /code/requirements.txt
WORKDIR /code
RUN pip install -r requirements.txt
ADD . .

CMD [ "gunicorn", "--bind", "0.0.0.0", "-p", "8000",  "amdtelecom.wsgi" ]

在我的项目设置文件中:


CORS_ALLOWED_ORIGINS = [
    "http://localhost:8000",
    "http://127.0.0.1:8000",
    "http://localhost"
]
STATIC_URL = '/static/'

if PROD:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    STATICFILES_DIRS = [
        BASE_DIR / "static",
    ]
    
    
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = "/media/"

SITE_URL = 'http://localhost:80'

我在终端中使用以下步骤:

    docker-compose up -d --build docker ps -a docker exec -it 'my gunicorn id' bash ./manage.py 迁移 ./manage.py 收集静态 ./manage.py 加载数据数据.json

并在 url localhost 中打开尝试在 chrome 浏览器中打开项目 并且项目在没有静态文件的情况下打开(没有 js,没有 css)。 在我的 docker 日志中:

> (docker-compose logs -f):
2021/03/25 10:51:32 [error] 51#51: *18 open() "/amd/static/images/fashion/product/13.jpg" failed (13: Permission denied), client: 172.23.0.1, server: localhost, request: 
"GET /static/images/fashion/product/13.jpg HTTP/1.1", host: "localhost", referrer: "http://localhost/"

我想要一个关于我的代码的注释 - 这个应用程序已经在 Mac OS 中运行良好,静态文件可以正常打开。我认为我的问题与我的 Linux 操作系统有关。

我该如何解决这个问题?

提前致谢。关于我的代码的更多信息是github repo:

【问题讨论】:

我检查了你的仓库。在卷中的 Docker-compose 文件中,您使用 ./static/:/amd/static./media/:/amd/media。但是我在那里找不到 amd 文件夹。路径是否正确? 尝试同步卷装载中的尾部斜杠,如此处所述***.com/questions/38583900/… @ctwx 感谢您的评论,但我尝试了这种方法,但无法取得任何积极的结果。我想要一个关于我的代码的注释 - 这个应用程序已经在 Mac OS 中运行良好,静态文件可以正常打开。我认为我的问题与我的 Linux 有关。 @IvanStarostin 感谢在我的问题编辑中提供的帮助,我更改了斜杠,但得到了相同的错误。我想要一个关于我的代码的注释 - 这个应用程序已经在 Mac OS 中运行良好,静态文件可以正常打开。我认为我的问题与我的 Linux 有关。 然后检查目录权限。 【参考方案1】:

问题可能在于权限,更确切地说在于文件所有者 - 您可以在静态(或媒体)卷中的所有文件上使用 chmod 777 轻松解决(但不太安全)。

第二个选项是在这里https://***.com/a/66910717/7113416 描述的容器用户,或者在这里https://***.com/a/56904335/7113416 可能更好

【讨论】:

以上是关于权限被拒绝,无法打开静态文件,Docker,Django的主要内容,如果未能解决你的问题,请参考以下文章

无法在 docker 中启动 tomcat:“权限被拒绝”

无法打开流或文件:无法打开流:权限被拒绝[重复]

无法打开输出文件,权限被拒绝

无法打开流或文件:无法打开流:权限被拒绝

“无法打开流或文件“laravel.log”:无法打开流:权限被拒绝”

我收到错误日志文件的消息“无法打开流或文件“.../laravel.log”:无法打开流:权限被拒绝” [重复]