簡體   English   中英

在“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 Volume。

在構建我的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不起作用,因為我期待它。)

這是我的配置文件:

## 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的方法涉及更少的系統開銷,因為您運行的容器少了一個。

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文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM