启动器重建失败,卡在“'bundle exec rake themes:update assets:precompile'”

我正在尝试构建一个新的 Discourse Docker 镜像,但似乎它在迁移阶段失败了。

    I, [2020-12-15T15:02:28.688540 #1] INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'

    I, [2020-12-15T15:04:19.530701 #1] INFO -- :

    I, [2020-12-15T15:04:19.530966 #1] INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile'

    清理临时文件

    捆绑资源

    I, [2020-12-15T15:04:36.448680 #374] INFO -- : 写入 /var/www/discourse/public/assets/vendor-bdb3fefe8aefde7bf6aef331a6edd24482502b370ed9f6f299836c72ee6a843c.js

    I, [2020-12-15T15:04:43.818563 #374] INFO -- : 写入 /var/www/discourse/public/assets/admin-073db5e5695d9f3834b9ad41d66ef30a02b9ca85fc9c95f272257ea9c7a67f21.js

    I, [2020-12-15T15:04:43.822864 #374] INFO -- : 写入 /var/www/discourse/public/assets/browser-detect-115ab5953de1b5bb122bfb26b757f5391dd8d1d2aef2b81baf7b59aee99d9f34.js
.
.
.
.
.
.
.
.
.
.
.

    35:M 15 Dec 2020 15:06:27.009 * 300 秒内发生 10 次更改。正在保存...

    35:M 15 Dec 2020 15:06:27.010 * 后台保存已由进程 ID 1066 启动

    1066:C 15 Dec 2020 15:06:27.010 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:27.110 # 后台保存错误

    35:M 15 Dec 2020 15:06:33.020 * 300 秒内发生 10 次更改。正在保存...

    35:M 15 Dec 2020 15:06:33.020 * 后台保存已由进程 ID 1067 启动

    1067:C 15 Dec 2020 15:06:33.020 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:33.121 # 后台保存错误

    35:M 15 Dec 2020 15:06:39.030 * 300 秒内发生 10 次更改。正在保存...

    35:M 15 Dec 2020 15:06:39.031 * 后台保存已由进程 ID 1068 启动

    1068:C 15 Dec 2020 15:06:39.031 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:39.131 # 后台保存错误

    gzip -f -c -9 /var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js > /var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js.gz

    brotli -f --quality=11 /var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js --output=/var/www/discourse/public/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js.br

    35:M 15 Dec 2020 15:06:45.041 * 300 秒内发生 10 次更改。正在保存...

    35:M 15 Dec 2020 15:06:45.042 * 后台保存已由进程 ID 1072 启动

    1072:C 15 Dec 2020 15:06:45.042 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:45.142 # 后台保存错误

    完成压缩 application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js:耗时 25.87 秒

    完成压缩所有 JS 文件:耗时 83.62 秒

    开始编译 CSS:2020-12-15 15:06:49 UTC

    编译默认 CSS:2020-12-15 15:06:49 UTC

    预编译目标:桌面 深色模式

    35:M 15 Dec 2020 15:06:51.051 * 300 秒内发生 10 次更改。正在保存...

    35:M 15 Dec 2020 15:06:51.051 * 后台保存已由进程 ID 1074 启动

    1074:C 15 Dec 2020 15:06:51.051 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:51.151 # 后台保存错误

    rake 终止!

    Redis::CommandError: ERR 运行脚本时出错(调用 f_45fe64238f6598e6c505af0aad74b4e178e891f4):@user_script:14: @user_script: 14: -MISCONF Redis 已配置为保存 RDB 快照,但目前无法持久化到磁盘。可能修改数据集的命令已被禁用,因为此实例配置为在 RDB 快照失败时报告写入错误(stop-writes-on-bgsave-error 选项)。请检查 Redis 日志以获取有关 RDB 错误的详细信息。

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis/client.rb:132:in `call'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.2.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2585:in `block in _eval'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `block in synchronize'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:69:in `synchronize'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2584:in `_eval'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.5/lib/redis.rb:2636:in `evalsha'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/backends/redis.rb:425:in `cached_eval'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/backends/redis.rb:144:in `publish'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus.rb:382:in `publish'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/distributed_cache.rb:80:in `publish'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/distributed_cache.rb:90:in `set'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.4/lib/message_bus/distributed_cache.rb:135:in `[]='

    /var/www/discourse/app/models/theme.rb:142:in `get_set_cache'

    /var/www/discourse/app/models/theme.rb:158:in `components_for'

    /var/www/discourse/app/models/theme.rb:185:in `block in transform_ids'

    /var/www/discourse/app/models/theme.rb:142:in `get_set_cache'

    /var/www/discourse/app/models/theme.rb:177:in `transform_ids'

    /var/www/discourse/app/models/theme.rb:371:in `list_baked_fields'

    /var/www/discourse/app/models/theme.rb:367:in `resolve_baked_field'

    /var/www/discourse/lib/stylesheet/manager.rb:423:in `color_scheme_digest'

    /var/www/discourse/lib/stylesheet/manager.rb:361:in `digest'

    /var/www/discourse/lib/stylesheet/manager.rb:339:in `stylesheet_filename'

    /var/www/discourse/lib/stylesheet/manager.rb:300:in `source_map_filename'

    /var/www/discourse/lib/stylesheet/manager.rb:251:in `compile'

    /var/www/discourse/lib/stylesheet/manager.rb:169:in `block (2 levels) in precompile_css'

    /var/www/discourse/lib/stylesheet/manager.rb:162:in `each'

    /var/www/discourse/lib/stylesheet/manager.rb:162:in `block in precompile_css'

    /var/www/discourse/lib/stylesheet/manager.rb:161:in `each'

    /var/www/discourse/lib/stylesheet/manager.rb:161:in `precompile_css'

    /var/www/discourse/lib/tasks/assets.rake:54:in `block (2 levels) in <main>'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:86:in `each_connection'

    /var/www/discourse/lib/tasks/assets.rake:47:in `block in <main>'

    /var/www/discourse/lib/tasks/assets.rake:331:in `block in <main>'

    /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'

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

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

    任务:TOP => assets:precompile:css

    (通过运行任务并添加 --trace 参数可查看完整堆栈跟踪)

    I, [2020-12-15T15:06:53.012968 #1] INFO -- : 正在下载 MaxMindDB...

    压缩 JavaScript 并生成源映射

    I, [2020-12-15T15:06:53.013385 #1] INFO -- : 终止异步进程

    I, [2020-12-15T15:06:53.013424 #1] INFO -- : 向 exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 35 发送 TERM 信号

    35:signal-handler (1608044813) 收到 SIGTERM,计划关闭...

    35:M 15 Dec 2020 15:06:53.054 # 用户请求关闭...

    35:M 15 Dec 2020 15:06:53.054 * 退出前保存最终 RDB 快照。

    35:M 15 Dec 2020 15:06:53.054 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:53.054 # 尝试保存数据库时出错,无法退出。

    35:M 15 Dec 2020 15:06:53.054 # 收到 SIGTERM,但在尝试关闭服务器时出错,请检查日志以获取更多信息

    35:M 15 Dec 2020 15:06:57.060 * 300 秒内发生 10 次更改。正在保存...

    35:M 15 Dec 2020 15:06:57.060 * 后台保存已由进程 ID 1078 启动

    1078:C 15 Dec 2020 15:06:57.061 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:57.161 # 后台保存错误

    I, [2020-12-15T15:07:03.014092 #1] INFO -- : exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid:35 未能正常终止,强制终止!

    失败

    --------------------

    Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' 执行失败,返回码为 #<Process::Status: pid 372 exit 1>

    失败位置:/pups/lib/pups/exec_command.rb:112:in `spawn'

    exec 执行失败,参数为 {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}

    be9c92f00a4814e5e9ebcdb06f25232b03f7522390b97c157085c2f7ef7f3387

    ** 引导失败 ** 请向上滚动查看更早的错误消息,可能不止一条。

    简而言之,我看到的错误如下:

    68:C 15 Dec 2020 15:06:39.031 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:39.131 # 后台保存错误

    35:M 15 Dec 2020 15:06:51.051 * 后台保存已由进程 ID 1074 启动

    1074:C 15 Dec 2020 15:06:51.051 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)以进行保存:权限被拒绝

    35:M 15 Dec 2020 15:06:51.151 # 后台保存错误

    rake 终止!

    Redis::CommandError: ERR 运行脚本时出错(调用 f_45fe64238f6598e6c505af0aad74b4e178e891f4):@user_script:14: @user_script: 14: -MISCONF Redis 已配置为保存 RDB 快照,但目前无法持久化到磁盘。可能修改数据集的命令已被禁用,因为此实例配置为在 RDB 快照失败时报告写入错误(stop-writes-on-bgsave-error 选项)。请检查 Redis 日志以获取有关 RDB 错误的详细信息。

我的 app.yaml 文件内容如下:

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/redis.template.yml"
env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 8
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "xxxxx"
  DISCOURSE_DB_HOST: "xxxxx"
  DISCOURSE_REDIS_HOST: 127.0.0.1
  DISCOURSE_REDIS_PORT: "6379"
  DISCOURSE_DB_NAME:  discourse_prod_2
  DISCOURSE_DEVELOPER_EMAILS: 'xxxxxxx'
  DISCOURSE_HOSTNAME: 'localhost'
  DISCOURSE_DB_PORT: "5301"  
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-slack-official.git
          - git clone https://github.com/discourse/discourse-assign.git
run:
  - exec:
      cd: /var/www/discourse
      cmd:
        - sed -i 's/GlobalSetting.serve_static_assets/true/' config/environments/production.rb

出于安全考虑,我已隐藏密码、主机名和邮箱。对于 Redis,我正在运行一个独立的 Docker 容器。我能够在 localhost 和指定端口上连接到它。

请告诉我是否遗漏了什么。

如果您在独立容器中运行,请从 app.yml 中删除以下行:

- "templates/redis.template.yml"

您的外部 Redis 要么配置错误,要么正承受沉重的 I/O 等待压力,从而导致此问题。您需要修复该问题。

@Falco 即使我通过从配置文件中移除 Redis 主机和端口来使用默认的 Redis,我仍然收到相同的错误:

sets',url='/assets/application-42d4413fabab7a4b12e0c25fb01f736af560aa283089071a8493f37c9b042a4a.js.map'\"

35:M 15 Dec 2020 16:43:25.078 * 300 秒内发生 10 次更改。正在保存...

35:M 15 Dec 2020 16:43:25.079 * 后台保存已由进程 ID 1064 启动

1064:C 15 Dec 2020 16:43:25.079 # 无法打开 RDB 文件 dump.rdb(位于服务器根目录 /pups)进行保存:权限被拒绝

35:M 15 Dec 2020 16:43:25.179 # 后台保存出错 

Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' 执行失败,返回状态为 #<Process::Status: pid 371 exit 1>

失败位置:/pups/lib/pups/exec_command.rb:112:in `spawn'

exec 失败,参数为 {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}

d514879d2a044425c1e7d833dafb8196ae0a3026aa75119512349188531b2a5d

您的文件权限设置不正确。Redis 无法打开其自身的 dump 文件。

@Falco 但这发生在 Discourse Docker 构建镜像的过程中。我该如何更改它?

您是否已将 Redis 模板重新添加到 app.yml 中?

该文件位于 /var/discourse/shared/standalone/redis_data/dump.rdb,权限为 644,所有者 UID 为 106,GID 为 110。

听起来您手动更改了此文件(可能还有其他文件)的权限。

我甚至还没有构建镜像,所以我不明白它怎么会被更改。我已经将 redis.template.yml 添加到了我的文件中。

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/redis.template.yml"
env:
  LANG: en_US.UTF-8
  UNICORN_WORKERS: 8
  DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: "xxxxx"
  DISCOURSE_DB_HOST: "xxxxx"
  DISCOURSE_DB_NAME:  discourse_prod_2
  DISCOURSE_DEVELOPER_EMAILS: 'xxxxxxx'
  DISCOURSE_HOSTNAME: 'localhost'
  DISCOURSE_DB_PORT: "5301"  
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-slack-official.git
          - git clone https://github.com/discourse/discourse-assign.git
run:
  - exec:
      cd: /var/www/discourse
      cmd:
        - sed -i 's/GlobalSetting.serve_static_assets/true/' config/environments/production.rb

不过,我是以 root 用户身份运行 ./launcher rebuild 的。这会有影响吗?

您现在必须手动修复受影响文件的权限。

问题已解决:通过为 PostgreSQL 和 Redis 分别构建容器,并从 app.yml 中删除 "templates/redis.template.yml" 行。