Python Nginx不使用docker compose和django提供静态文件(13:权限被拒绝)
我使用docker compose和docker machine来设置一个包含多个容器的开发环境。我有一个nginx容器,它充当django应用程序的代理,还提供静态文件)。我还有一个用于django应用程序的容器,一个用于postgresql,一个用于postgresdata。 目录结构如下所示: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
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的文件夹权限。