在“docker-compose run”命令后,音量变化不是持续的(Django的collectstatic)

我有一个使用Docker Compose创build的Django环境,并试图使用manage.py collectstatic将我站点的静态文件复制到容器中的一个目录中。 这个目录(/ usr / src / app / static)也是一个Docker卷。

在build立我的docker集装箱( docker-compose build )之后,我运行docker-compose run web python manage.py collectstatic ,其工作正常,但是我的web服务器(Nginx)没有find这些文件,也没有任何文件运行docker-compose run web ls -la /usr/src/app/static

任何想法,我做错了什么?

(注意:我的Dockerfile中没有manage.py collectstatic ,因为我的设置需要加载我的“.env”文件,而且我没有看到在Dockerfile中加载这个文件的方法。知道为什么Docker Compose不能像我期待的那样工作。)

这是我的configuration文件:

 ## 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/ 

运行docker-compose run ...启动一个新的容器并在那里执行命令。 那么当你运行docker-compose up它将创build另一个新的容器…,它没有你之前命令的改变。

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

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

并将web-static添加到nginx容器上的'volumes-from'列表中

除了Paul Becotte的方法之外,还有其他几种方法可以做到这一点:

答:随着docker-compose v 1.6的发布(在Paul的答案时不可用),现在可以使用docker-compose文件版本2来指定卷

 version: '2' volumes: django-static: driver: local django: ... volumes: - django-static:/usr/src/app/static 

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

 docker-compose run django ./manage.py collectstatic 

使用这种方法应该涉及较less的系统开销,然后Pauls的方法,因为你正在运行一个容器。

B.轻微的破解 – 你可以在容器命令中收集静态文件

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

这一点的缺点是,如果你从docker-compose命令行中调用不同的命令,那么collectstatic将无法运行。 当你可能不需要的时候,你也正在运行collectstatic文件。