一个简单的问题:
我肯定少了一些脑细胞!
我们在 /var/www/discourse/app/views/layouts 目录下的某个文件中对应用容器做了一些修改。
然后,我们(像傻瓜一样)以为只需通过 /var/discourse/launcher rebuild app 重建容器即可(其实不行),但每次这样做,我们的修改都会被覆盖。
我们不想 fork Discourse,但我们希望使用 launcher 重建应用时,不会覆盖我们的本地修改。
请问有人能告诉我们该怎么做吗?
谢谢!
看来我们找到了问题所在:在重建过程中,无论我们尝试什么方法,应用中的文件都会被覆盖:
原因似乎是 launcher 拉取了基础的 Discourse 镜像,而该镜像中包含一个 .git 目录,其 git 配置文件自然指向 Discourse 的主仓库,从而覆盖了我们所做的更改:
launcher
pull_image() {
# 添加一次重试以解决 dockerhub TLS 错误
$docker_path pull $image || $docker_path pull $image
}
之前我们误以为 launcher 是构建镜像(我们怎么会忽略这一点?!),现在很清楚,它实际上是从 Docker Hub 拉取基础镜像。
一切从头再来!
是否有某个标志可以设置,让 launcher 不再拉取基础镜像,而是改为构建它?
neounix
(Dark Matter)
4
你好 @DBHacker
听起来你可能想这样做:
- 对基础容器进行修改(正如你提到的)
- 为该镜像打标签并保存
- 将该镜像推送到你自己的 Docker 镜像仓库
- 编辑
launcher,使其从你的仓库中 docker pull 这个修改后的基础镜像
希望这能在某种程度上帮到你!
不过,Meta 平台(至少我认为)并不支持这种操作,所以你需要自行解决。
祝你黑客玩得开心! 
注意:我还没有尝试过这个方法……但听起来你玩得很开心! 
1 个赞
neounix
(Dark Matter)
6
你好 @pfaffman
我完全同意你的观点,使用插件和主题组件是最佳方案!这种方法得到完全支持,并且有助于与 Meta 开发团队保持同步。
保持好奇心、探索各种可能性并深入理解 Discourse 也是非常有价值的。在昨天阅读了这个主题后,我创建了一个本地 Docker 仓库,在本地给 Discourse 基础镜像打了标签,将该镜像推送到我的新 Docker 仓库(localhost),然后通过从该本地仓库拉取基础 Discourse 镜像重新构建了 Discourse 应用。
我觉得实验和学习更多关于 Discourse 的知识非常有趣,而这次系统管理员的探索/实验让我受益匪浅。当然,这并不是我们运行生产应用的方式,但通过亲自走一遍从 localhost 而非远程拉取 Discourse 基础镜像的步骤,我学到了很多,而且整个过程出乎意料地简单。因此,我将这次实验整理成文,分享给其他好奇的系统管理员:
希望其他系统管理员探索者也能从这次实验中获益,哪怕只是一点点。
保持好奇
1 个赞
Stephen
(Stephen)
7
有一种非常简单的方法可以实现这一点,无需担心图片问题或编写插件。只要您只是修改现有的扁平文件,就可以通过 app.yml 对其进行修改。
搜索 hooks 和 pups。其他一些指南已经使用了这种方法。
5 个赞
感谢 @neounix
我也喜欢学习和尝试新事物。
等哪天有时间了,我会试着多了解一些 Docker 和本地镜像仓库的知识。
目前,我还是专注于插件开发,因为 Discourse 支持插件开发,并且符合 Discourse 的开发模式。
正如你所说,学习这些知识很有趣,但保持在主流范围内也很重要!

2 个赞
neounix
(Dark Matter)
9
同意。
即使尝试了本地 Docker 注册表和本地 Discourse 基础镜像,我也无法获得一致的结果(不确定原因,我可能在配置中遗漏了某个关键细节)。
另一方面,我对本地 Docker 注册表以及如何构建和管理它有了更深入的了解。
只是一个旁支的 Docker 实验……确实学到了很多!
1 个赞