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

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

新規登録して質問してみよう
ただいま回答率
86.12%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

解決済

本番環境で起きるrailsの{Don't know how to build task 'assets:precompile'}エラーを解決したい。

senseIY
senseIY

総合スコア277

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

1回答

0リアクション

0クリップ

570閲覧

投稿2022/08/24 06:55

編集2022/08/25 01:26

前提

現在こちらのサイトを参考にdocker-compose を使用してバックエンド側(Rails APIモード)とフロントエンド側(React TypeScript)で開発したポートフォリオをAWSにデプロイしようとしています。現在サイトの通りに、一旦ローカル環境でRailsが本番環境で正常に作動するかチェックをしています。しかし、以下のエラーが発生してしまいます。

発生している問題・エラーメッセージ

$ docker-compose -f docker-compose.production.yml run api rails assets:precompile RAILS_ENV=production --trace Starting redictum_ver-20_db_1 ... done rails aborted! Don't know how to build task 'assets:precompile' (See the list of available tasks with `rails --tasks`) /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/task_manager.rb:59:in `[]' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:159:in `invoke_task' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/commands/rake/rake_command.rb:24:in `block (2 levels) in perform' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/commands/rake/rake_command.rb:24:in `block in perform' /usr/local/lib/ruby/gems/3.1.0/gems/rake-13.0.6/lib/rake/rake_module.rb:59:in `with_application' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/commands/rake/rake_command.rb:18:in `perform' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/command.rb:51:in `invoke' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/commands.rb:18:in `<main>' /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require' /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require' bin/rails:4:in `<main>'

エラーが発生してしまうのは

wsl

docker-compose -f docker-compose.production.yml run rails rails assets:precompile RAILS_ENV=production

このコマンドを打った時です

docker-compose.production.yml

yml

version: "3.3" services: api: build: context: ./backend/ dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec puma -C ./backend/config/puma.rb -e production" volumes: - ./backend:/myapp - ./backend/vendor/bundle:/myapp/vendor/bundle environment: TZ: Asia/Tokyo RAILS_ENV: production # ports: # - "3001:3000" depends_on: - db stdin_open: true tty: true env_file: - .env user: root front: build: context: ./frontend/ dockerfile: Dockerfile volumes: - ./frontend/app:/usr/src/app command: sh -c "yarn && yarn start" ports: - "4000:3000" environment: - WDS_SOCKET_PORT=0 db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} command: --default-authentication-plugin=mysql_native_password volumes: - mysql-data:/var/lib/mysql - /tmp/dockerdir:/etc/mysql/conf.d/ ports: - "3306:3306" cap_add: - SYS_NICE web: build: context: backend/containers/nginx volumes: - public-data:/myapp/public - tmp-data:/myapp/tmp ports: - 80:80 depends_on: - api volumes: db: driver: local public-data: tmp-data: log-data: mysql-data:

Dockerfile(Rails)

Docker

FROM ruby:3.1.2-buster RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs default-mysql-client ENV RAILS_ENV=production ENV APP_PATH /myapp RUN mkdir $APP_PATH WORKDIR $APP_PATH COPY Gemfile $APP_PATH/Gemfile COPY Gemfile.lock $APP_PATH/Gemfile.lock RUN bundle install COPY . $APP_PATH # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. RUN mkdir -p tmp/sockets RUN mkdir -p tmp/pids CMD ["rails", "server", "-b", "0.0.0.0"]

Dockerfile(nginx)

FROM nginx:alpine # インクルード用のディレクトリ内を削除 RUN rm -f /etc/nginx/conf.d/* # Nginxの設定ファイルをコンテナにコピー ADD nginx.conf /etc/nginx/conf.d/myapp.conf # ビルド完了後にNginxを起動 CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

nginx.conf

# プロキシ先の指定 # Nginxが受け取ったリクエストをバックエンドのpumaに送信 upstream myapp { # ソケット通信したいのでpuma.sockを指定 server unix:///myapp/tmp/sockets/puma.sock; } server { listen 80; # ドメインもしくはIPを指定 server_name localhost; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /myapp/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @myapp; keepalive_timeout 5; # リバースプロキシ関連の設定 location @myapp { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://myapp; } }

試して見たこと

・まず、私はAPIモードを使用しているのでassets:precompileをする必要がないのではないかと考えて、コマンドを実行しましたが、以下のエラーが発生してしまいました。

/usr/bin/entrypoint.sh: line 8: exec: RAILS_ENV=production: not found

・assets:precompileに関するエラー情報の多くはrailsのバージョンがかなり古いものが多いためあまり参考になりませんでした。
このサイトはまあまあ新しそうな情報だったため、applicationlrbに以下を書き込みました。

rb

require 'capistrano/bundler' require 'capistrano/rails/migrations'

しかし、エラーが発生してしまいました。

$ docker-compose -f docker-compose.production.yml run api rails assets:precompile RAILS_ENV=production Starting redictum_ver-20_db_1 ... done rails aborted! LoadError: cannot load such file -- capistrano/bundler /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require' /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in `require' /myapp/config/application.rb:4:in `<main>' /myapp/Rakefile:4:in `require_relative' /myapp/Rakefile:4:in `<main>' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/commands/rake/rake_command.rb:20:in `block in perform' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/commands/rake/rake_command.rb:18:in `perform' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/command.rb:51:in `invoke' /usr/local/bundle/gems/railties-7.0.3.1/lib/rails/commands.rb:18:in `<main>' /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require' /usr/local/bundle/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require' bin/rails:4:in `<main>' (See full trace by running task with --trace)

いろいろ調べてみるとCapistranoは自動デプロイに使うものだと判明しました。ですが、私はそのような機能を入れる予定はないため、あまりエラーの解決策にはならないように思えました。
・今使っているrailsは7系です

なぜこのようなエラーが発生してしまうのでしょうか?何かしらアドバイスがあればよろしくお願いいたします。欠けている情報があれば追記いたします。

追記

このGithubの議論を参考に以下を試しました
以下をGemfileに追記

gem 'sass-rails' gem 'uglifier' gem 'coffee-rails'

application.rbに追記

require 'sprockets/railtie'

これで再度buildしましたが、

api_1 | For more information see: https://github.com/rails/sprockets/blob/070fc01947c111d35bb4c836e9bb71962a8e0595/UPGRADING.md#manifestjs api_1 | bundler: failed to load command: puma (/usr/local/bundle/bin/puma) api_1 | /usr/local/bundle/gems/sprockets-rails-3.4.2/lib/sprockets/railtie.rb:110:in `block in <class:Railtie>': Expected to find a manifest file in `app/assets/config/manifest.js` (Sprockets::Railtie::ManifestNeededError) api_1 | But did not, please create this file and use it to link any assets that need api_1 | to be rendered by your app: api_1 | api_1 | Example: api_1 | //= link_tree ../images api_1 | //= link_directory ../javascripts .js api_1 | //= link_directory ../stylesheets .css api_1 | and restart your server api_1 |

以下のエラーが発生してしまいました。私の予想ですが、やはりrailsのAPIモードを使用する際には本番環境であってrails assets:precompile はいらないように思えます。ちなみにそのままupをすると、

! Unable to load application: I18n::InvalidLocaleData: can not load translations from /usr/local/bundle/bundler/gems/devise_token_auth-1a0483fbd125/config/locales/ja.yml: #<Psych::SyntaxError: (<unknown>): did not find expected key while parsing a block mapping at line 20 column 7> api_1 | bundler: failed to load command: puma (/usr/local/bundle/bin/puma)

このようなエラーになります。このエラーが出るのは本番環境のときだけです。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。