使用dokku部署Django应用时的collectstatic配置错误
在用dokku部署Django应用时,我遇到了一个错误。
Collectstatic configuration error. To debug, run:
$ heroku run python ./manage.py collectstatic --noinput
我找不到在dokku容器中运行 heroku run python ./manage.py collectstatic --noinput
的方法,但当我尝试 dokku run my app python ./manage.py collectstatic --noinput
时,静态文件成功复制到了 STATIC_ROOT
文件夹,而且没有出现错误信息。
我通过把 collectstatic
命令放进 Procfile
解决了这个问题:
web: python manage.py collectstatic --noinput ; gunicorn myapp.wsgi
不过,我还是想知道是什么导致了这个问题,以及该如何调试。有什么想法吗?
1 个回答
在你的settings.py文件里,你应该有四个设置,分别是 MEDIA_ROOT
、MEDIA_URL
、STATIC_ROOT
和 STATIC_URL
。
我把我的设置成这样:
MEDIA_ROOT = 'media'
STATIC_ROOT = 'static'
MEDIA_URL = '/media'
STATIC_URL = '/static'
在创建的docker容器里,你会发现你的应用程序在 /app 目录下,这样媒体文件的路径就是 /app/media/,静态文件的路径就是 /app/static/。
不过,如果你在git里没有提交media和static文件夹,它们不会自动在 /app 下创建。
因为git不允许你提交一个空文件夹(它只会提交文件),所以我在我的项目里会这样做:
mkdir media static
touch media/.dir
touch static/.dir
git add media/.dir static/.dir
git commit -m '创建media和static目录'
这里的'touch'命令是用来创建一个空文件的,然后你用'git add'把这两个新创建的文件添加进去并提交。
现在,当你推送代码的时候,这些目录就会存在,可以用来存放媒体和静态文件。只要记住,每次你执行'git push'时,都会创建一个新的容器,而旧的容器会被销毁。虽然这对你的静态文件来说没问题,但如果你不把媒体文件存放在其他地方,它们就会丢失。