我正在用Docker构建一个Django应用程序。当数据库准备好时,我在入口点运行命令collectstatic。当我检查我的容器时,/static/
文件夹是空的。因此,Nginx无法加载静态文件。
# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = '/static/'
这是我的docker-compose文件
version: "3.9"
services:
db:
image: postgis/postgis:14-3.3
container_name: db
volumes:
- ./data/db:/var/lib/postgresql/data
env_file:
- prod.env
backend:
container_name: backend
build:
dockerfile: ./django/Dockerfile
command: gunicorn api.wsgi:application --bind 0.0.0.0:8000
volumes:
- static:/usr/src/app/static
ports:
- "8000:8000"
env_file:
- prod.env
depends_on:
- db
nginx:
container_name: nginx
build:
dockerfile: ./nginx/Dockerfile
volumes:
- static:/usr/src/app/static
ports:
- "80:80"
depends_on:
- backend
restart: always
redis:
container_name: redis
restart: unless-stopped
image: redis:alpine
expose:
- 6379
worker:
container_name: worker
build:
dockerfile: ./django/Dockerfile
command: celery -A api worker -l INFO
volumes:
- static:/usr/src/app/static
env_file:
- prod.env
depends_on:
- db
- backend
- redis
volumes:
static:
我的Nginx配置:
upstream api {
server backend:8000;
}
server {
listen 80;
location / {
proxy_pass http://api;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /usr/src/app/static/;
}
}
后端停靠文件:
# syntax=docker/dockerfile:1
FROM python:3
WORKDIR /usr/src/app
RUN apt-get update
RUN apt-get install -y libgdal-dev gdal-bin netcat
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY /django/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY /django/django-entrypoint.sh /django-entrypoint.sh
RUN chmod +x /django-entrypoint.sh
COPY django /usr/src/app
ENTRYPOINT ["/django-entrypoint.sh"]
以及入口点:
#!/bin/sh
if [ "$POSTGRES_NAME" = "postgres" ]
then
echo "Waiting for Postgres..."
while ! nc -z $POSTGRES_HOST $POSTGRES_PORT; do
sleep 0.1
done
echo "PostgreSQL started"
fi
ls
# python manage.py flush --no-input
python manage.py migrate --no-input
python manage.py collectstatic --no-input
exec "$@"
在我的文件(本地)中,我似乎没有看到要生成的"/static/"文件夹。这是怎么回事?我已经通过ssh在容器中检查了backend
和nginx
中的static,并且static文件夹为空。在日志中,collectstatic执行时没有出现错误,并显示以下消息:
后端|将173个静态文件复制到"/static "。
2条答案
按热度按时间ccrfmcuu1#
使用Docker named volume保存静态文件
此命名卷仅存在于Docker的存储中;您将无法在主机系统或本地源树中看到其内容。
对于您在此描述的设置,这不是问题:由于每次容器启动时都要重新运行
collectstatic
,并且卷内容隐藏了该目录中的映像内容,因此这些文件不必存在于源代码控制或主机文件系统中,如果确实需要,可以在非Docker虚拟环境中运行manage.py collectstatic
。jutyujz02#
尝试在Dockerfile中添加以下命令并重新构建映像。
您可以将其放置在
RUN pip install --no-cache-dir -r requirements.txt
之后