Python Nginx不使用docker compose和django提供静态文件(13:权限被拒绝)

Python Nginx不使用docker compose和django提供静态文件(13:权限被拒绝),python,django,nginx,docker,docker-compose,Python,Django,Nginx,Docker,Docker Compose,我使用docker compose和docker machine来设置一个包含多个容器的开发环境。我有一个nginx容器,它充当django应用程序的代理,还提供静态文件)。我还有一个用于django应用程序的容器,一个用于postgresql,一个用于postgresdata。 目录结构如下所示: code/ -- nginx/ Dockerfile nginx.conf -- web/ django-project/ stati

我使用docker compose和docker machine来设置一个包含多个容器的开发环境。我有一个nginx容器,它充当django应用程序的代理,还提供静态文件)。我还有一个用于django应用程序的容器,一个用于postgresql,一个用于postgresdata。 目录结构如下所示:

code/
  -- nginx/
       Dockerfile
       nginx.conf
  -- web/
       django-project/
       static/
       Dockerfile
       manage.py
       requirements.txt
  .env
  docker-compose.yml
  production.yml
为了运行应用程序,我使用docker machine:

docker-machine create -d virtualbox dev
然后我跑:

docker-compose build
docker-compose up -d
应用程序已启动并在机器的ip上运行。问题是nginx无法提供静态文件,因为它没有权限(13:权限被拒绝)

我的设置如下所示:

code/
  -- nginx/
       Dockerfile
       nginx.conf
  -- web/
       django-project/
       static/
       Dockerfile
       manage.py
       requirements.txt
  .env
  docker-compose.yml
  production.yml
nginx Dockerfile:

# Set nginx base image
FROM nginx

# Copy custom configuration file from the current directory
COPY nginx.conf /etc/nginx/nginx.conf
FROM python:3.5.1-onbuild
nginx.conf:

worker_processes 1;

events {
    worker_connections 1024;
}

http {

    server {
        listen 80;
        server_name example.org;

        access_log /dev/stdout;
        error_log /dev/stdout info;

        location /static/ {
            alias /usr/src/app/static/;
        }

        location / {
            proxy_pass http://web:8000;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
}
django Dockerfile:

# Set nginx base image
FROM nginx

# Copy custom configuration file from the current directory
COPY nginx.conf /etc/nginx/nginx.conf
FROM python:3.5.1-onbuild
docker-compose.yml:

web:
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
  volumes:
    - /usr/src/app/static
  env_file: .env
  command: /usr/local/bin/gunicorn collecteev_django.wsgi:application -w 2 -b :8000

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  volumes_from:
    - web
  links:
    - web:web

postgres:
  restart: always
  image: postgres:latest
  volumes_from:
    - data
  ports:
    - "5432:5432"

data:
  restart: always
  image: postgres:latest
  volumes:
    - /var/lib/postgresql
  command: "true"
版本:

docker: 1.9.1
docker-compose: 1.5.2
docker-machine: 0.5.4

我们将非常感谢您对此问题的任何帮助,谢谢

谢谢你提出了一个深思熟虑的问题。它具有良好的调试信息。我突然想到的一件事是,在构建映像之后,在web容器中装载
/usr/src/app/static
,这将覆盖已经存在的静态文件夹(实际上是一个空文件夹)。Nginx可能拒绝授予权限,不是因为它无法读取该文件夹,而是因为该文件夹为空。能否打开堆栈,在web容器中执行
docker exec-it bash
,确认静态文件夹的权限以及其中是否包含内容?感谢回复!这里是对静态文件夹的权限:
drwxr-xr-x 4 root 80 Jan 23 20:43 static
其中有“admin”文件夹,这是从以下位置获取的静态文件:
docker compose run web/usr/local/bin/python manage.py collectstatic--noinput
但是没有我的“web/static”文件夹的痕迹只需添加权限,并从每个nginx和web容器输出到原始问题。从nginx容器得到的是相同的东西:相同的权限,静态文件夹中有相同的文件,但我的“web/static”文件夹中没有文件奇怪的是,我在本地构建了一个类似的测试(在nginx后面有一个静态文件夹的小型Django应用程序),它运行良好,无需更改权限。这两个容器都使用root作为用户,并且拥有755的文件夹权限。感谢您提出一个经过深思熟虑的问题。它具有良好的调试信息。我突然想到的一件事是,在构建映像之后,在web容器中装载
/usr/src/app/static
,这将覆盖已经存在的静态文件夹(实际上是一个空文件夹)。Nginx可能拒绝授予权限,不是因为它无法读取该文件夹,而是因为该文件夹为空。能否打开堆栈,在web容器中执行
docker exec-it bash
,确认静态文件夹的权限以及其中是否包含内容?感谢回复!这里是对静态文件夹的权限:
drwxr-xr-x 4 root 80 Jan 23 20:43 static
其中有“admin”文件夹,这是从以下位置获取的静态文件:
docker compose run web/usr/local/bin/python manage.py collectstatic--noinput
但是没有我的“web/static”文件夹的痕迹只需添加权限,并从每个nginx和web容器输出到原始问题。从nginx容器得到的是相同的东西:相同的权限,静态文件夹中有相同的文件,但我的“web/static”文件夹中没有文件奇怪的是,我在本地构建了一个类似的测试(在nginx后面有一个静态文件夹的小型Django应用程序),它运行良好,无需更改权限。这两个容器都使用root作为用户,并具有755的文件夹权限。