twtrubiks/docker-django-nginx-uwsgi-postgres-tutorial

docker-compose build not rebuild project

lyc2345 opened this issue · 8 comments

嗨,很好的教學,但我遇到一個問題,能不能為我解惑解惑,麻煩你了。

我clone了這個專案,然後執行docker-compose up --build
這時候如果我輸入http://0.0.0.0:8080/api/music/ 瀏覽器會出現下列錯誤

api-container |   File "./django_rest_framework_tutorial/urls.py", line 26, in <module>
api-container |     url(r'^api/', include(router.urls, namespace='api'), name='api'),
api-container |   File "/usr/local/lib/python3.6/site-packages/django/urls/conf.py", line 39, in include
api-container |     'Specifying a namespace in include() without providing an app_name '
api-container | django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.
api-container | [pid: 10|app: 0|req: 1/2] 172.23.0.1 () {42 vars in 744 bytes} [Mon Jan  8 09:05:38 2018] GET /admin/ => generated 109203 bytes in 161 msecs (HTTP/1.1 500) 4 headers in 130 bytes (1 switches on core 0)

是include的錯誤,但我也不太知道怎麼解決,我使用最簡單的方法就是刪除api/ , api-auth/只留下url(^'admin', ...)這一行,因為我只想測試nginx,uwsgi,django之間的溝通,但我發現我每次重新build,我進入到api-container查看 cat django_rest_gramework_tutorial/url.py 被我刪除的兩行都沒有被刪除。
然後我想說是不是他沒有確實rebuild,然後我也有試過docker-compose down之後再重新build也還是會出現,我甚至直接docker rmi image,但也一樣,不知道您有沒有遇過類似的情形呢?

hi 你好,這是因為 django 2.0 的關係,你把 api 裡面的 requirements.txt 修改為 django<=2.0 即可,因為太多的 repo 要改了QAQ,這個沒改到,你改完再重新執行一次應該就可以 work 了

我改了重新build還是一樣,看樣子是django也沒有真正改成<=2.0。
但主要問題是您是否也有遇過明明改了code,例如我把url.py刪去,但我docker-compose build了還是會出現...

試試先執行 docker-compose down -v, 然後再重新build ~
這是 volume 的概念,你可以參考 Docker 基本教學 - 從無到有 Docker-Beginners-Guide

Hello twtrubiks,
超讚的教學!
我也是遇到一樣的問題,那以後每當修改到程式碼的時候,
就要docker-compose down -V 刪除container
再docker-compose up 在新建container
好像很麻煩,有更好的方法?

感謝

@barbo1942 因為 volume 有兩種設定方式,
一種是將路徑同步到你的 host 本機,另一種是 Named volume。

我這個範例是使用 Named volume 這方法 (也是官方推薦的),
如果你會反覆的修正code,我會建議使用將路徑同步到你的 host 本機的方法(同步你會反覆修改的地方),
你可以參考我這個範例 Docker + Jenkins + Django + Postgres 設定
這教學裡有兩種方式。

  1. 找docker-compose位置

whereis docker-compose

  1. 如果有安裝 先刪掉之前安裝的檔案

rm /usr/bin/docker-compose

  1. 進到root

sudo -i

  1. 下載檔案放到/usr/bin/
    curl -L https://github.com/docker/compose/releases/download/1.11.1/docker-compose-`uname -s-uname -m > /usr/bin/docker-compose

  2. 修改權限

chmod +x /usr/bin/docker-compose

我认为

....
api:
   volumes:
        - api_data:/docker_api
...

是把整个项目做为数据卷了,这样即便你更新了代码,无论如何rebuild都是老代码,因为代码被数据卷里都代码所覆盖。

 - .:/docker_api
        - static_volume:/docker_api/static
        - media_volume:/docker_api/media

这样会比较合适

@marscj 謝謝分享.
在 docker 中 volumes 有兩種方式 ,
方法一: 同步到你的 host 本機
方法二: Named volume (官網似乎是建議這種方式, 但這種方式的缺點就是沒辦法和本機同步)
謝謝你分享的方法一, 我個人是會看需求決定要用那一種方式.