构建因 ruby 版本不匹配而失败

在使用 ./launcher bootstrap web_only && ./launcher destroy web_only && ./launcher start web_only 几天没有问题后,我尝试使用 rails 控制台将 SiteSetting.can_permanently_delete = true 设置为 true 时遇到了问题,方法是使用 ./launcher enter web_only 然后是 rails c

问题: 在单独的容器模式下访问 rails 控制台的方式不同吗?

在未能成功重建和引导后,我将服务器回滚到实施 AI 内容之前的几天。没有成功!
引导方法失败,显示如下:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3' failed with return #<Process::Status: pid 465 exit 18>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"bundle_exec", "cmd"=>["su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'", "su discourse -c 'bundle clean'", "su discourse -c 'find /var/www/discourse/vendor/bundle -name cache -not -path \\\"*/gems/*\\\" -type d -exec rm -rf {} +'", "su discourse -c 'find /var/www/discourse/vendor/bundle -name tmp -type d -exec rm -rf {} +'"]}
bootstrap failed with exit code 18
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
aee0f5c110bf8ce78f05c138a78712b4a0116fe6662c998b2f29800715036091

./launcher rebuild web_only 也会报错

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web_only (06b7b1f7f6b476adac20a11a55de776d7350e837407a6c7a6ba582c917f6dd73): Bind for 0.0.0.0:80

在通过管理员界面更新 Docker Manager 后,我收到以下信息:

You are running an old version of the Discourse image
Updates via the web UI are disabled until you run the latest image. To do so log in to your server using SSH and run:

  cd /var/discourse
  ./launcher rebuild app

问题: 你们对目前的情况有什么想法吗?

导致构建失败的错误如下:

[2026-02-17T16:51:13.376629 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
Your Ruby version is 3.3.8, but your Gemfile specified ~= 3.4

您需要向上滚动才能找到错误。

3 个赞

是的,我已经这样做了,但从未看到任何有用的信息。
这是最新的。
exitcode18.txt (43.5 KB)

这是错误信息:

[2026-02-17T16:51:13.376629 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
您的 Ruby 版本是 3.3.8,但您的 Gemfile 指定了 ~\> 3.4

您的 discourse Docker 是否固定在旧版本了?或者,这可能是一个错误,但看起来不太可能出现这种会通过构建测试的错误。

谢谢 Jay。我看到了,但成功的构建中出现奇怪的消息并不罕见。

没有,如前所述,我遵循了 OP 的指示。

@pfaffman 感谢您的移动!

1 个赞

你能拉取 /var/discourse 吗?重建应使用基础镜像 2.0.20260209-1300 完成。

1 个赞

感谢 @supermathie 的介入

使用的是从全新 ./launcher rebuild web_only 构建的 2.0.20260209-1300

Status: Downloaded newer image for discourse/base:2.0.20260209-1300
docker.io/discourse/base:2.0.20260209-1300
Ensuring launcher is up to date
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 web_only
web_only
2.0.20260209-1300: Pulling from discourse/base
Digest: sha256:50d2dae489a9c9916c3d50d880f7f1282fcbe179339b60a8947ab135c1f1f9bf
Status: Image is up to date for discourse/base:2.0.20260209-1300
docker.io/discourse/base:2.0.20260209-1300

build 结束

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web_only (9e391a36bdc1a80a6b993a466ffdba25337ce70f1fe74f2b5d8aaca75585322b): Bind for 0.0.0.0:80 failed: port is already allocated

failed to set up container networking.txt (74.3 KB)

编辑
我怀疑最初的问题始于转换为两个容器。

您的服务器上的某个程序已在使用 80 端口,需要停止它。

但你说过它之前一直在工作,而且你已经重建了好几次了。

服务器上只有 Discourse

我做过,而且现在也在做 :grinning_face:

原始帖子中有三种重建选项。我引用的那个从未奏效,即导致失败

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1310/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      1316/docker-proxy

正在检查另外两个运行独立容器的实例……@pfaffman 指出的消息

使用 ./launcher bootstrap web_only && ./launcher destroy web_only && ./launcher start web_only 得到相同的结果

Already up to date
╭ Warning ─────────────────────────────────────────────────────────────────────╮
│                                                                              │
│   Ignored build scripts: @swc/core@1.15.7, core-js@2.6.12, core-js@3.47.0,   │
│   esbuild@0.25.12, esbuild@0.27.1, lefthook@2.1.0.                           │
│   Run "pnpm approve-builds" to pick which dependencies should be allowed     │
│   to run scripts.                                                            │
│                                                                              │
╰──────────────────────────────────────────────────────────────────────────────╯
I, [2026-02-17T21:07:23.811289 #1]  INFO -- : => cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
Your Ruby version is 3.3.8, but your Gemfile specified ~= 3.4

是的。那样行不通。它从来就没起过作用。我不知道怎么会有人建议那样做。我不知道我怎么会没注意到有人建议那样做。双容器设置的要点是,你几乎从不升级数据。

如果你需要升级数据,那么你需要只关闭 web 容器,然后重建数据容器,再启动 web_only 容器。我已经更新了 OP(原帖)。

如果你遇到端口冲突错误,那很可能是因为当 Docker 重启时,它首先重启了旧的应用容器,是它占用了端口。你可以用以下命令检查:

docker ps

看看 app 是否在运行。你希望它是正在运行的,因为那可以解释端口问题。
你可能需要执行

 docker stop app; docker rm app
2 个赞