重新安装 discourse 时不要忘记运行 docker remove app

我使用 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 目录发生了变化,那就太好了。

2 个赞

如果你想运行 bootstrap,那么“discourse 的方式”是:

./launcher bootstrap app
./launcher destroy app
./launcher start app

但如果你只有一个容器,那么直接运行

./launcher rebuild app

就像几乎所有示例说的那样,也没有什么问题。这会停止正在运行的容器,引导一个新的容器,然后启动它。如果引导因某种原因失败,你通常可以(通常)使用 ./launcher start app(正如你所描述的)来重启旧的容器。

我认为问题出在“容器实例”和“容器镜像”的通常混淆上。

例如,如果您查看 10. 安装后维护,它会显示:

用法:launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]
命令:
    start:      启动/初始化容器
    stop:       停止正在运行的容器
    restart:    重启容器
    destroy:    停止并移除容器
    enter:      使用 nsenter 进入容器 shell
    logs:       查看容器的 Docker 日志
    bootstrap:  根据模板为配置引导容器
    rebuild:    重建容器(销毁旧的,引导,启动新的)
    cleanup:    移除所有已停止超过 24 小时的容器

在此帮助输出中,“容器”一词在大多数情况下指的是容器的实例。除了 bootstrap,它指的是镜像。(./launcher bootstrap 使用 docker commit 创建一个新镜像,后续的容器实例可以从中启动。)我认为这是出乎意料的(我天真地认为它也会影响当前的 app 实例。)

rebuild 中,“容器”一词同时指容器镜像和实例,因为它涉及一组操作,这些操作会影响容器实例和容器镜像。

而且不清楚它在 cleanup 中指的是什么——是只移除实例,还是也移除引导的镜像?

1 个赞