对使用 docker-compose 卷来提供 django 静态文件的困惑
Confusion on using docker-compose volumes to serve django static files
Docker 菜鸟,尝试使用 Compose 设置一个简单的 Django 项目。我已经 ,但这次我尝试了不同的设置,但我不明白为什么它不起作用。
我有以下 docker-compose.yml 文件:
data:
image: postgres:9.4
volumes:
- /var/lib/postgresql
command: /bin/true
db:
image: postgres:9.4
restart: always
expose:
- "5432"
volumes_from:
- data
app:
build: .
restart: always
env_file: .env
expose:
- "8000"
links:
- db:db
volumes:
- .static:/static_files
web:
build: docker/web
restart: always
ports:
- "80:80"
links:
- app:app
volumes_from:
- app
我的/Docker文件是:
FROM python:3.5
ENV PYTHONUNBUFFERED 1
ADD . /app
WORKDIR /app
RUN pip install -r requirements.txt
RUN SECRET_KEY=tmpkey python manage.py collectstatic --noinput
CMD gunicorn mysite.wsgi:application -b 0.0.0.0:8000
我的/docker/web/Dockerfile是:
FROM nginx:1.9
RUN rm /etc/nginx/conf.d/default.conf
ADD default.conf /etc/nginx/conf.d/
我的 /docker/web/default.conf 文件是:
server {
listen 80 default_server;
location /static/ {
autoindex on;
alias /static_files/;
}
location / {
proxy_pass http://app: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;
}
}
docker 的输出显示静态文件安装到 /static_files,但 nginx returns 404 对于 /static 下的所有文件。如果我查看我的 .static 文件夹(在项目的根目录中),该目录是空的(除了我在那里的 .gitkeep 文件)。如果我 运行 docker-compose app run ls -la /static_files
,目录是空的,但是 docker-compose app run ls -la /app/.static
有 .gitkeep 文件。显然我对 Docker 和 Compose 有误解。对我做错了什么有什么想法吗?我的理解是 RUN SECRET_KEY=tmpkey python manage.py collectstatic --noinput
应该将文件写入我的本地 .static 文件夹并且 nginx 应该看到这些文件;两者都没有发生。
软件版本:docker-compose 版本 1.7.0,构建 0d7bf73 和 Docker 版本 1.11.0,在 OS X 上构建 4dc5990,docker-机器连接到云实例。
我仍然不清楚为什么我的原始代码不起作用,但是将我的代码切换为使用 Compose 的 v2 格式是可行的,我在服务之外定义了我的卷。
这是我更新的 docker-compose.yml 文件:
version: '2'
services:
db:
image: postgres:9.4
restart: always
expose:
- "5432"
volumes:
- postgres-data:/var/lib/postgresql
app:
build: .
restart: always
env_file: .env
expose:
- "8000"
links:
- db:db
volumes:
- static-data:/static_files
web:
build: docker/web
restart: always
ports:
- "80:80"
links:
- app:app
volumes:
- static-data:/static_files
volumes:
postgres-data:
driver: local
static-data:
driver: local
其余配置文件保持不变。
(可能值得注意的是,在我 运行 这个新配置之前,我删除了 docker volume ls
中列出的所有现有 Docker 卷——也许这是我的实际修复?)
我偶然发现了这个问题,因为我的静态文件在部署我的 Docker Compose 设置后不会更新。
删除所有 Docker 卷有帮助——正如多兰在他的回答结尾所建议的那样。我的静态文件在 运行 之后更新:
docker volume prune
当然这会删除卷及其内容,所以要小心!
Docker 菜鸟,尝试使用 Compose 设置一个简单的 Django 项目。我已经
我有以下 docker-compose.yml 文件:
data:
image: postgres:9.4
volumes:
- /var/lib/postgresql
command: /bin/true
db:
image: postgres:9.4
restart: always
expose:
- "5432"
volumes_from:
- data
app:
build: .
restart: always
env_file: .env
expose:
- "8000"
links:
- db:db
volumes:
- .static:/static_files
web:
build: docker/web
restart: always
ports:
- "80:80"
links:
- app:app
volumes_from:
- app
我的/Docker文件是:
FROM python:3.5
ENV PYTHONUNBUFFERED 1
ADD . /app
WORKDIR /app
RUN pip install -r requirements.txt
RUN SECRET_KEY=tmpkey python manage.py collectstatic --noinput
CMD gunicorn mysite.wsgi:application -b 0.0.0.0:8000
我的/docker/web/Dockerfile是:
FROM nginx:1.9
RUN rm /etc/nginx/conf.d/default.conf
ADD default.conf /etc/nginx/conf.d/
我的 /docker/web/default.conf 文件是:
server {
listen 80 default_server;
location /static/ {
autoindex on;
alias /static_files/;
}
location / {
proxy_pass http://app: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;
}
}
docker 的输出显示静态文件安装到 /static_files,但 nginx returns 404 对于 /static 下的所有文件。如果我查看我的 .static 文件夹(在项目的根目录中),该目录是空的(除了我在那里的 .gitkeep 文件)。如果我 运行 docker-compose app run ls -la /static_files
,目录是空的,但是 docker-compose app run ls -la /app/.static
有 .gitkeep 文件。显然我对 Docker 和 Compose 有误解。对我做错了什么有什么想法吗?我的理解是 RUN SECRET_KEY=tmpkey python manage.py collectstatic --noinput
应该将文件写入我的本地 .static 文件夹并且 nginx 应该看到这些文件;两者都没有发生。
软件版本:docker-compose 版本 1.7.0,构建 0d7bf73 和 Docker 版本 1.11.0,在 OS X 上构建 4dc5990,docker-机器连接到云实例。
我仍然不清楚为什么我的原始代码不起作用,但是将我的代码切换为使用 Compose 的 v2 格式是可行的,我在服务之外定义了我的卷。
这是我更新的 docker-compose.yml 文件:
version: '2'
services:
db:
image: postgres:9.4
restart: always
expose:
- "5432"
volumes:
- postgres-data:/var/lib/postgresql
app:
build: .
restart: always
env_file: .env
expose:
- "8000"
links:
- db:db
volumes:
- static-data:/static_files
web:
build: docker/web
restart: always
ports:
- "80:80"
links:
- app:app
volumes:
- static-data:/static_files
volumes:
postgres-data:
driver: local
static-data:
driver: local
其余配置文件保持不变。
(可能值得注意的是,在我 运行 这个新配置之前,我删除了 docker volume ls
中列出的所有现有 Docker 卷——也许这是我的实际修复?)
我偶然发现了这个问题,因为我的静态文件在部署我的 Docker Compose 设置后不会更新。
删除所有 Docker 卷有帮助——正如多兰在他的回答结尾所建议的那样。我的静态文件在 运行 之后更新:
docker volume prune
当然这会删除卷及其内容,所以要小心!