質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

2525閲覧

Railsのアセットパイプラインに関するエラー Sprockets::Rails::Helper::AssetNotFound

NoSuke23

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/04/05 15:05

Production環境にてRailsアセットパイプラインエラー Sprockets::Rails::Helper::AssetNotFound

RailsアプリをECS(FARGATE)にデプロイしようと試みています。Railsの環境はproductionです。

登録したドメインにアクセスすると以下のエラー

Sprockets::Rails::Helper::AssetNotFound
The asset "application.css" is not present in the asset pipeline.

<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>

エラー通りに解釈するとSprocketsがcssのアセットファイルを読み込めないらしいです。

■試したこと
・1. rails_app/config/initializers/assets.rbに以下を記載

Rails.application.config.assets.paths << "/rails_app/public/assets"

・2. dockerコンテナ内(ローカル上)のrails console -e productionにて

irb(main):003:0> helper.stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' => "<link rel=\"stylesheet\" media=\"all\" href=\"/assets/application-xxxxx.css\" data-turbolinks-track=\"reload\" />"

となったのでpublic/assetsのシンボリックリンクを生成、public/assets/*をassets/に移動

などを行いましたが結局だめでした。暫定対策は

# production.rb config.assets.compile = false

ですが、正直望ましくありません。

以下がDockerfile, dockerignoreとなります。

ARG NODE_VERSION=14.16.0-alpine3.13 ARG RUBY_VERSION=3.0.0-alpine FROM node:${NODE_VERSION} as node FROM ruby:${RUBY_VERSION} # Node.js, Yarnのインストール ARG YARN_VERSION=v1.22.5 COPY --from=node /opt/yarn-${YARN_VERSION} /opt/yarn COPY --from=node /usr/local/bin/node /usr/local/bin/ COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/ RUN ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \ && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm ENV PATH $PATH:\ /usr/local/bin/yarn:\ /usr/local/bin/node # 依存パッケージのインストール RUN apk add --no-cache -t .build-dependencies \ build-base \ libxml2-dev\ libxslt-dev \ && apk add --no-cache \ bash \ file \ imagemagick \ libpq \ libxml2 \ libxslt \ mysql-client \ mysql-dev \ tini \ tzdata # 環境変数の設定 ENV RAILS_ENV="production" ENV NODE_ENV="production" ENV LANG="C.UTF-8" ENV TZ="Asia/Tokyo" ENV RAILS_SERVE_STATIC_FILES="true" # gemのインストールと依存パッケージの削除 WORKDIR /rails_app COPY Gemfile \ Gemfile.lock \ /rails_app/ RUN gem install bundler \ && bundle install -j$(getconf _NPROCESSORS_ONLN) --without development \ && apk del --purge .build-dependencies # アプリケーションコードのコピー COPY . /rails_app/ # アセットのプリコンパイル ARG SECRET_KEY_BASE RUN bundle exec rails assets:precompile SECRET_KEY_BASE=${SECRET_KEY_BASE} RAILS_ENV=${RAILS_ENV}\ && yarn cache clean \ && rm -rf node_modules tmp/cache CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
# Ignore bundler. .bundle vendor/bundle # Ignore all logfiles and tempfiles, but keep the sockets directory. log/* tmp/* !log/.keep !tmp/sockets/ !tmp/.keep # Ignore pidfiles, but keep the directory. tmp/pids/* !tmp/pids/ !tmp/pids/.keep # Ignore uploaded files in development. storage/* !storage/.keep public/assets/* .byebug_history # Ignore keys for decrypting credentials and more. config/master.key config/credentials/production.key public/packs public/packs-test node_modules yarn-error.log yarn-debug.log* .yarn-integrity # Ignore environment files. .env* # Ignore ignore files .dockerignore .gitignore

問題点はRUN bundle exec rails assets:precompile(以下略)だとみていますが解決できません。SECRET_KEY_BASEも問題なく、ローカルdocker-composeでは問題なく動作します。
リバースプロキシにnginx、public/, tmp/sockets/をボリュームで共有しています。

解決策をご教示していただけると大変ありがたいです。何卒宜しくお願いします。

■参考
https://railsguides.jp/asset_pipeline.html
https://qiita.com/metheglin/items/c5c756246b7afbd34ae2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。原因はFARGATEタスクストレージで、このエフェメラルストレージにpublicディレクトリをマウントするとDocker volumeと違いSprocketsやWebpackがアクセスできなくなってしまうようです。

■知見
・エフェメラルストレージはunix接続を行う場合のsocket配置には有効。
・エフェメラルストレージは静的アセットの共有場所としては使えない(FARGATEの場合s3あるいはefsを用いるべき?)。

投稿2021/04/06 07:03

NoSuke23

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問