Django静态文件未复制到Docker容器上的saticfiles文件夹中

时间:2018-12-13 17:30:14

标签: django python-3.x docker docker-compose dockerfile

当试图将我的static / media文件夹复制到docker上的staticfiles / medialfiles时,我试图了解我在做什么错了。

这就是我所拥有的:

settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "mediafiles")

Dockerfile

FROM python:3.6
ENV PYTHONUNBUFFERED 1
ENV C_FORCE_ROOT true

RUN mkdir /www
WORKDIR /www
COPY . /www/
RUN pip install -r requirements.txt 
RUN python3 /www/manage.py collectstatic --noinput

docker-compose

# use this file only for live production
# docker-compose up -d web
version: '3'
volumes:
  db_psql:
  postgis-data:
  esdata:

services:
  web:
    build: .
    restart: always
    container_name: django_web
    command: gunicorn --bind 0.0.0.0:8080 LG__CXS4.wsgi
    depends_on:
      - nginx
    volumes:
      - .:/www
    ports:
      - "8080:8080"
    links:
      - redis 

  nginx:
    restart: always
    image: "nginx" 
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./staticfiles:/static
      - ./mediafiles:/media 

运行docker文件时,我得到: 5355静态文件复制到'/ www / staticfiles'。,但是当我查看容器的staticfiles时,它是空的。

编辑:查看下面的答案中的ngnix配置文件,以弄清错误。

3 个答案:

答案 0 :(得分:0)

  1. 如果要通过docker-compose调出容器,则可以删除

    运行mkdir / www

    WORKDIR / www

    复制。 / www /

从您的Web Dockerfile中下载文件,因为您正在将卷装载到composer文件中

  1. 我认为您会尝试从nginx容器中提供静态文件,因此您会docker exec -it <nginx_container> bash并确保将文件复制到/ static和/ media正确吗?

答案 1 :(得分:0)

我通过容器内部的地址而不是项目地址来更改STATIC_ROOT变量的值

STATIC_ROOT ='/ webapp / static'#'。/ static'<-两者均可

然后在容器运行时在另一个命令窗口中抛出下一个命令

docker-compose exec name_service_web python manage.py collectstatic --noinput

答案 2 :(得分:0)

可疑者既不是Dockerfile,也不是docker-compose。问题出在 nginx 。它在别名中缺少www

有效的是:

  server {
  listen 80;
  server_name localhost;

  # serve static files
  location /static/ {
    alias /www/static/;
  }

  # serve media files
  location /media/ {
    alias /www/media/;
  }

  # pass requests for dynamic content to gunicorn
  location / {
    proxy_pass http://web:8080;
  }
}