使用dokku部署Django应用时的collectstatic配置错误

5 投票
1 回答
4548 浏览
提问于 2025-04-18 15:21

在用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 个回答

9

在你的settings.py文件里,你应该有四个设置,分别是 MEDIA_ROOTMEDIA_URLSTATIC_ROOTSTATIC_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'时,都会创建一个新的容器,而旧的容器会被销毁。虽然这对你的静态文件来说没问题,但如果你不把媒体文件存放在其他地方,它们就会丢失。

撰写回答