2015-08-15 38 views
2

我有一个使用Docker Compose创建的Django环境,并且我试图使用manage.py collectstatic将我站点的静态文件复制到容器。这个目录(/ usr/src/app/static)也是一个Docker卷。“docker-compose运行”命令后,卷更改不会持久(Django的collectstatic)

建设我的Docker容器(docker-compose build)后,我跑docker-compose run web python manage.py collectstatic,预期其工作原理,但我的Web服务器(Nginx的)未找到文件,也没有任何文件,当我运行docker-compose run web ls -la /usr/src/app/static

关于我在做什么错的任何想法? (注意:我的Dockerfile中没有manage.py collectstatic,因为我的设置需要加载我的“.env”文件,并且我没有看到在Dockerfile中加载这个文件的方法。无论哪种情况,我都希望知道为什么,因为我也期待泊坞撰写不工作)

这里是我的配置文件:

## docker-compose.yml: 
web: 
    restart: always 
    build: . 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - /usr/src/app/static 
    - .:/code 
    env_file: .env 
    command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload 

nginx: 
    restart: always 
    build: ./config/nginx 
    ports: 
    - "80:80" 
    volumes: 
    - /www/static 
    volumes_from: 
    - web 
    links: 
    - web:web 

postgres: 
    restart: always 
    image: postgres:latest 
    volumes: 
    - /var/lib/postgresql 
    ports: 
    - "5432:5432" 


## Dockerfile: 
FROM python:3.4.3 
RUN mkdir /code 
WORKDIR /code 
ADD . /requirements/ /code/requirements/ 
RUN pip install -r /code/requirements/docker.txt 
ADD . /code/ 
+0

对于那些希望在Django中使用Compose的人,我在相关的SO帖子中有一个更新的例子:http://stackoverflow.com/a/36726663/318870 –

回答

5

运行docker-compose run ...开始一个新的容器,并在那里执行命令。那么当您运行docker-compose up时,它会创建另一个新的容器......它不具有上一条命令的更改。

你想要做的是启动一个数据容器来保存你的静态文件。另一个容器中加入这样你撰写的文件...

web-static: 
    build: . 
    volumes: 
    - /usr/src/app/static 
    env_file: .env 
    command: manage.py collectstatic 

,并添加网页静态的“卷,从”列表中找到nginx的容器上

3

有一对夫妇的其他方式来做到这一点除了保罗Becotte的方法:

A.随着泊坞窗,撰写v 1.6(不可用保罗的答案的时间)的版本中,您现在可以使用泊坞窗,撰写文件版本2指定卷

version: '2' 
volumes: 
    django-static: 
    driver: local 

django: 
    ... 
    volumes: 
    - django-static:/usr/src/app/static 

那么你可以收集静态文件在一个单独的容器中,他们将持续

docker-compose run django ./manage.py collectstatic 

使用这种方法应包括更少的系统开销,然后保罗的方法,因为你正在运行一个都不能少容器。

B.轻微的黑客 - 你可以收集静态文件容器中的命令

django: 
    command: bash -c "./manage.py collectstatic --noinput; 
    /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload" 

的这个缺点是,它是不灵活,如果你调用从搬运工,撰写命令行不同的命令,然后collectstatic不会得到跑。有时你可能不需要运行collectstatic文件。