"docker-compose run" 命令后音量变化不持久(Django 的 collectstatic)

Volume changes not persistent after "docker-compose run" command (Django's collectstatic)

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

构建我的 docker 容器 (docker-compose build) 后,我 运行 docker-compose run web python manage.py collectstatic 按预期工作,但我的网络服务器 (Nginx) 没有找到文件,当我 运行 docker-compose run web ls -la /usr/src/app/static.

时也没有任何文件

对我做错了什么有什么想法吗?

(注意:我的 Docker 文件中没有 manage.py collectstatic,因为我的设置需要加载我的“.env”文件,但我没有看到加载它的方法Docker 文件。在任何一种情况下,我都想知道为什么 Docker Compose 不能像我期望的那样工作。)

这是我的配置文件:

## 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 它会创建另一个新容器......它没有你之前命令的变化。

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

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

与 Pauls 的方法相比,使用此方法的系统开销应该更少,因为您 运行 少了一个容器。

乙。小 hack - 你可以在容器命令中收集静态文件

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

这样做的缺点是,如果您从 docker-compose 命令行调用不同的命令,那么它是不灵活的,那么 collectstatic 将不会得到 运行。此外,您 运行 有时可能不需要收集静态文件。