「'bundle exec rake themes:update assets:precompile'」でランチャーのリビルドが失敗しています

新しい Discourse の Docker イメージを構築しようとしていますが、migrate ステージで失敗しているようです。

    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 -- : Writing /var/www/discourse/public/assets/vendor-bdb3fefe8aefde7bf6aef331a6edd24482502b370ed9f6f299836c72ee6a843c.js

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

    I, [2020-12-15T15:04:43.822864 #374] INFO -- : Writing /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 * バックグラウンド保存を pid 1066 で開始

    1066:C 15 Dec 2020 15:06:27.010 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    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 * バックグラウンド保存を pid 1067 で開始

    1067:C 15 Dec 2020 15:06:33.020 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    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 * バックグラウンド保存を pid 1068 で開始

    1068:C 15 Dec 2020 15:06:39.031 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    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 * バックグラウンド保存を pid 1072 で開始

    1072:C 15 Dec 2020 15:06:45.042 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    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

    precompile ターゲット: デスクトップ Dark

    35:M 15 Dec 2020 15:06:51.051 * 300 秒間に 10 件の変更。保存中...

    35:M 15 Dec 2020 15:06:51.051 * バックグラウンド保存を pid 1074 で開始

    1074:C 15 Dec 2020 15:06:51.051 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    35:M 15 Dec 2020 15:06:51.151 # バックグラウンド保存エラー

    rake aborted!

    Redis::CommandError: ERR Error running script (call to f_45fe64238f6598e6c505af0aad74b4e178e891f4): @user_script:14: @user_script: 14: -MISCONF Redis は RDB スナップショットの保存に設定されていますが、現在ディスクへの永続化ができません。RDB スナップショットの保存に失敗した場合に書き込みエラーを報告するようにこのインスタンスが設定されているため(stop-writes-on-bgsave-error オプション)、データセットを変更する可能性のあるコマンドは無効化されています。RDB エラーの詳細については、Redis ログを確認してください。

    /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>'

    Tasks: 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 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    35:M 15 Dec 2020 15:06:53.054 # DB の保存中にエラーが発生し、終了できません。

    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 * バックグラウンド保存を pid 1078 で開始

    1078:C 15 Dec 2020 15:06:57.061 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    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 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    35:M 15 Dec 2020 15:06:39.131 # バックグラウンド保存エラー

    35:M 15 Dec 2020 15:06:51.051 * バックグラウンド保存を pid 1074 で開始

    1074:C 15 Dec 2020 15:06:51.051 # サーバールートディレクトリ /pups 内の RDB ファイル dump.rdb を保存するために開くのに失敗しました: 権限がありません

    35:M 15 Dec 2020 15:06:51.151 # バックグラウンド保存エラー

    rake aborted!

    Redis::CommandError: ERR Error running script (call to f_45fe64238f6598e6c505af0aad74b4e178e891f4): @user_script:14: @user_script: 14: -MISCONF Redis は RDB スナップショットの保存に設定されていますが、現在ディスクへの永続化ができません。RDB スナップショットの保存に失敗した場合に書き込みエラーを報告するようにこのインスタンスが設定されているため(stop-writes-on-bgsave-error オプション)、データセットを変更する可能性のあるコマンドは無効化されています。RDB エラーの詳細については、Redis ログを確認してください。

私の 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 * バックグラウンド保存が PID 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'

実行パラメータで失敗しました: {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}

d514879d2a044425c1e7d833dafb8196ae0a3026aa75119512349188531b2a5d

ファイルの権限設定が破損しています。Redis が自身のダンプファイルを開くことができません。

@Falco ですが、これは Discourse の Docker がイメージをビルドしている間に発生します。これをどのように変更すればよいでしょうか?

app.yml に Redis テンプレートは再度追加されましたか?

そのファイルは /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 を実行しています。これが何か影響を与えるでしょうか?

影響を受けたファイルの権限を手動で修正する必要があります。

Postgres と Redis 用に個別のコンテナを構築し、app.yml から "templates/redis.template.yml" の行を削除したことで、問題が解決しました。