我使用 Discourse 已经好几年了。我每六个月设置一个新的实例。我的设置包括 Docker 和一个基于 Nginx 的代理,所以可能有点不标准。因此,我没有使用 discourse-setup。
每六个月,当我重复这个过程时,在重新克隆一份新的 Discourse 并运行 ./launcher bootstrap app 后,容器都无法启动。日志显示:
anacron: Can't chdir to /var/spool/anacron: No such file or directory
run-parts: /etc/runit/1.d/anacron exited with return code 1
run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/01-cleanup-web-pids
run-parts: executing /etc/runit/1.d/anacron
anacron: Can't chdir to /var/spool/anacron: No such file or directory
等等,无穷无尽。
然后我通常会做一系列步骤来重新引导、重启、删除插件、重新添加它们等等,直到它最终起作用,但从未弄清楚最终是什么让它起作用。六个月后,同样的事情又发生了。我只是为了修复它而工作,而且不清楚我当时采取的许多步骤中,最终是哪一个让它起作用了。
不过这次,我认为我终于找到了问题所在,那就是:显然,./launcher start app 会重启名为 app 的旧容器实例,即使 Discourse 已经被重新克隆和重新引导。
缺失的步骤是 docker remove app。总结一下:
./launcher stop app
docker remove app
... 现在重新克隆、重新引导和 launcher start app 就可以工作了
我的错误是期望在运行 ./launcher bootstrap app 之后,下一个 ./launcher start app 会启动新的容器镜像,但这似乎并非如此。由于 /var/discourse/shared 路径已被重新初始化,旧的容器自然会出问题。
我把这个留在这里,以防其他人搜索相同的日志错误消息。
作为一个可能的改进,如果容器能够检测到它的 /var/discourse/shared 目录发生了变化,那就太好了。