使用 Docker 为开发安装 Discourse

在我的 Ubuntu 虚拟机上,我可以 ping 通 rubygems.org。我不确定是否有方法检查 Docker 容器是否能 ping 通。不过我想我只 ping 了 HTTP 版本,而不是 HTTPS 版本。提一下这个情况,以防问题与此相关。(我在谷歌搜索时看到的一个页面建议将 HTTPS 改为 HTTP,但既然定义的行为位于 Docker 容器内部,我无法这样做。)

1 个赞

我已经尝试了 macOS 选项。

首先使用选项 2,即 Homebrew。但我遇到了一些问题,因为该指南中的命令并未安装所有依赖项。https://medium.com/@yutafujii_59175/a-complete-one-by-one-guide-to-install-docker-on-your-mac-os-using-homebrew-e818eb4cfc3 这篇文章帮助我取得了一些进展。

现在我卡在 第 2 步 d/boot_dev --init

正在迁移数据库...

rake aborted!

PG::ConnectionBad: 无法连接到服务器:没有这样的文件或目录

服务器是否在本地运行,并正在监听

Unix 域套接字 "/var/run/postgresql/.s.PGSQL.5432" 上的连接?

/src/lib/site_settings/db_provider.rb:61:in `table_exists?'

/src/lib/site_settings/db_provider.rb:16:in `all'

/src/lib/site_settings/defaults_provider.rb:29:in `db_all'

/src/lib/site_setting_extension.rb:277:in `block in refresh!'

/src/lib/site_setting_extension.rb:274:in `synchronize'

/src/lib/site_setting_extension.rb:274:in `refresh!'

/src/lib/site_setting_extension.rb:495:in `block in setup_methods'

/src/config/initializers/004-message_bus.rb:120:in `<main>'

/src/config/environment.rb:7:in `<main>'

/usr/local/bin/bundle:23:in `load'

/usr/local/bin/bundle:23:in `<main>'

任务:TOP => db:migrate => db:load_config => environment

(通过运行 --trace 参数可查看详细堆栈跟踪)

随后我下载了 .dmg 文件,但由于我是 Docker 新手,不知道接下来该怎么做。如果能提供关于 macOS 选项更详细的说明那就太好了。

谢谢。

1 个赞

在 macOS 上,从 .dmg 安装 Docker 后,请确保它正在运行——macOS 菜单栏上应该有一个图标,你可以用它来检查其状态。然后,严格按照首帖中的步骤操作(克隆等)。如果按此方法遇到问题,请在此发帖。

注意,如果你之前通过 Homebrew 安装过 Docker,最好先卸载该版本,或至少确保它未运行。我从未通过 Homebrew 安装过 Docker,因此无法在此方面提供建议。

2 个赞

谢谢。

我点击了图标并打开了 Docker 面板,但在那里没有发现任何正在运行的容器。不过,我在命令行中可以看到有多个容器正在运行。我想知道是否需要登录才能使用 Docker 面板?或者这种行为是否是因为同时安装了多个版本的 Docker(通过 Homebrew 和 Desktop .dmg 文件)?

在此期间,我已在 DigitalOcean 上成功部署了 Discourse,运行正常,能够满足我的需求。

1 个赞

DMG 安装的是 Docker,而非 Discourse。它最初不会添加任何容器。

之后,您可以按照 Docker 指南进行操作。

2 个赞

在 Mac 上运行上述命令时,我遇到了以下错误:

安装 cppjieba_rb (0.3.3) 时发生错误,Bundler 无法继续。

请确保 `gem install cppjieba_rb -v '0.3.3' --source 'https://rubygems.org/'` 执行成功

然后再执行 bundling。

您有什么建议吗?我不太清楚具体问题出在哪里。单独运行 gem install 也无法解决(即使使用 sudo)。

另外,为什么在运行 Docker 镜像时还需要安装 gems?这些不应该已经预先安装好了吗?

更新:已解决

我克隆到了 ~/repos/discourse,但应该克隆到 ~/discourse。现在一切顺利。

3 个赞

如果在运行 d/unicorn 时遇到以下错误:

Could not find aws-partitions-1.284.0 in any of the sources
Run `bundle install` to install missing gems.

可以通过运行以下命令来解决:

docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RAILS_ENV=${RAILS_ENV:=development} bundle install"

之后,d/boot_dev 将能够成功运行。

3 个赞

更简单的方法:

d/boot_dev
d/bundle install

我们为所有常规任务提供了辅助工具。

5 个赞

在原帖中写道:

Docker 开发流程支持在 plugins/ 目录下使用符号链接

在这种情况下,我们应该将 plugins 目录符号链接到哪里?谢谢!

1 个赞
cd plugins
ln -s /full/path/to/your/plugin .
ln -s ~/src/my-great-plugin # 例如
6 个赞

啊,谢谢,在这个上下文中只是打算符号链接到插件目录。

1 个赞

通常情况下,您不会为这种工作流对整个目录创建符号链接,因为您通常希望在运行期间对哪些插件在作用域内进行细粒度的控制。

4 个赞

你好,我正在使用这份指南,一切运行正常,但我有一个担忧:每次运行 d/boot_dev 时,它都会开始下载各种文件。如何才能只下载一次所需的文件,并在下次启动时保留它们?我的操作系统是 Ubuntu 20.04。

1 个赞

尝试在全新的 Mint 20 系统上安装。Docker 已可用:

terrapop@terrapop:/var$ docker version
Client: Docker Engine - Community
 Version:           19.03.12

terrapop@terrapop:/var/discourse$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
     Active: active (running) since Mon 2020-08-24 19:03:48 CEST; 31min ago

随后克隆了 Discourse:

sudo git clone GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub /var/discourse
cd /var/discourse

但是,运行 d/boot_dev --init 后出现以下错误:

d/boot_dev --init

bash: d/boot_dev: 没有那个文件或目录

有人知道吗?

1 个赞

更新:我现已将 SendGrid API 密钥添加到 app.yml 中,并通过 ./launcher 引导启动了应用,现在它已在 localhost 上运行。OP 中的那些 d/ 命令是否都已过时?尽管如此,我还是不太明白。现在应用在我的 Ubuntu (Mint) 计算机上的 Docker 中于 localhost 运行,就像在 Digital Ocean 的测试环境中一样。我们希望在 localhost 上开发,让应用通过 Docker 运行,并为插件设置符号链接,但我不确定现在是否已按预期就绪,因为我无法以任何方式执行那些 d/ 命令。有人能帮忙吗?谢谢。

更新:是我的错。我使用了生产环境的 git 链接:

git clone GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub /var/discourse

而不是:

git clone GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub

:cowboy_hat_face:

不过…

现在又遇到了新问题。在 Ubuntu Mint 20 上,我只能以超级用户/root(UID 0)的身份将代码克隆到 /var 目录。因此,当我克隆并运行 d/boot_dev --init 时,所有下载和启动过程都正常,但在后续阶段脚本会抛出权限错误,因为它期望以 UID 1000 运行某些操作,而 UID 1000 是 Mint 上创建的第一个用户,即我的个人账户(terrapop),而非 root。如何解决这个问题?

解决方案:比我想象的简单。只需在 var 下创建一个名为 www 的新目录。将 www 目录的所有权(chown)和权限(chmod)设置为您在 Mint 上的第一个用户,然后按照 OP 帖子中的步骤继续操作。现在可以正常工作了,很高兴。

2 个赞

出于某种原因,指向我的插件源目录的符号链接无法正常工作,我不得不手动将插件源目录移动/复制到 plugins 目录中,以便在重启 Docker 容器后它们能出现在 /admin/plugins 中。

也许 Docker 对符号链接的支持方式发生了变化?我使用的是 Ubuntu 上的 docker-ce 19.03.12。

1 个赞

我最近在使用 Mac 版 Docker Desktop 时也遇到了同样的问题。

1 个赞

我在一个 5 美元的 DO Droplet 上执行了相同的步骤,一切顺利。现在我该如何暴露我的网站以便访问?

附:使用 ngrok 可以工作,但使用 nginx 反向代理到 9292 端口尚未成功

感谢这个提示。您可以在服务器上直接操作,从而避免配置 nginx 反向代理。正在享受 d/o 的 Docker + VS Code 远程开发环境 :slight_smile:

使用 d/unicorn -D 以守护进程模式运行 Unicorn,这样启动服务器后终端仍可继续使用。

另外,您至少需要一个 10 美元的 DO Droplet。

3 个赞

我使用的是 Mac,运行 zsh(在 iTerm2 中),当我尝试使用符号链接进行插件开发时,遇到了以下错误:

readlink: illegal option -- f
usage: readlink [-n] [file ...]

这是因为 Mac 上的 readlink 命令实现与 GNU 版本略有不同。

最简单的解决方法是执行以下操作:

# brew install coreutils
# ln -s "$(which greadlink)" "$(dirname "$(which greadlink)")/readlink"

这样你就可以使用兼容版本的 readlink

请注意,你需要将 dirname "$(which greadlink)" 的值添加到你的 PATH 中,并且其位置必须排在 /usr/bin(通常存放原始 readlink 命令的位置)之前。在我的情况下,PATH 类似于 /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:...,而指向 greadlink 的符号链接位于 /usr/local/bin

参考链接:Fixing "readlink: illegal option -- f" error on a Mac

5 个赞

要运行单个插件的测试套件,可以按以下方式操作:

# d/rake "plugin:spec[PLUGIN_NAME]"
1 个赞