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

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

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

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

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

AWS(Amazon Web Services)

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

Ruby on Rails 7

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

Q&A

解決済

1回答

3077閲覧

Rails本番環境で発生する[bundler: failed to load command: puma (/usr/local/bundle/bin/puma)]を解決したい

senseIY

総合スコア281

docker-compose

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

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

AWS(Amazon Web Services)

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

Ruby on Rails 7

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

0グッド

1クリップ

投稿2022/08/25 04:12

編集2022/08/25 05:32

前提

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

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

yml

1api_1 | ! 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> 2api_1 | bundler: failed to load command: puma (/usr/local/bundle/bin/puma) 3api_1 | /usr/local/bundle/gems/i18n-1.12.0/lib/i18n/backend/base.rb:254:in `rescue in load_yml': 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> (I18n::InvalidLocaleData)

docker-compose.production.yml(本番環境用)

yml

1version: "3.3" 2services: 3 api: 4 build: 5 context: ./backend/ 6 dockerfile: Dockerfile 7 command: bash -c "rm -f tmp/pids/server.pid && bundle exec puma -C config/puma.rb -e production" 8 volumes: 9 - ./backend:/myapp 10 - ./backend/vendor/bundle:/myapp/vendor/bundle 11 environment: 12 TZ: Asia/Tokyo 13 RAILS_ENV: production 14 # ports: 15 # - "3001:3000" 16 depends_on: 17 - db 18 stdin_open: true 19 tty: true 20 env_file: 21 - .env 22 user: root 23 24 front: 25 build: 26 context: ./frontend/ 27 dockerfile: Dockerfile 28 volumes: 29 - ./frontend/app:/usr/src/app 30 command: sh -c "yarn && yarn start" 31 ports: 32 - "4000:3000" 33 environment: 34 - WDS_SOCKET_PORT=0 35 36 db: 37 image: mysql:8.0 38 environment: 39 MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} 40 command: --default-authentication-plugin=mysql_native_password 41 volumes: 42 - mysql-data:/var/lib/mysql 43 - /tmp/dockerdir:/etc/mysql/conf.d/ 44 ports: 45 - "3306:3306" 46 cap_add: 47 - SYS_NICE 48 49 web: 50 build: 51 context: backend/containers/nginx 52 volumes: 53 - public-data:/myapp/public 54 - tmp-data:/myapp/tmp 55 ports: 56 - 80:80 57 depends_on: 58 - api 59 60volumes: 61 db: 62 driver: local 63 public-data: 64 tmp-data: 65 log-data: 66 mysql-data:

Dockerfile(backend rails)

Docker

1FROM ruby:3.1.2-buster 2 3RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn default-mysql-client 4 5ENV RAILS_ENV=production 6 7ENV APP_PATH /myapp 8 9RUN mkdir $APP_PATH 10WORKDIR $APP_PATH 11 12COPY Gemfile $APP_PATH/Gemfile 13COPY Gemfile.lock $APP_PATH/Gemfile.lock 14RUN bundle install 15 16COPY . $APP_PATH 17 18# Add a script to be executed every time the container starts. 19COPY entrypoint.sh /usr/bin/ 20RUN chmod +x /usr/bin/entrypoint.sh 21ENTRYPOINT ["entrypoint.sh"] 22EXPOSE 3000 23 24# Start the main process. 25RUN mkdir -p tmp/sockets 26RUN mkdir -p tmp/pids 27 28CMD ["rails", "server", "-b", "0.0.0.0"]

puma.rb

rb

1threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i 2threads threads_count, threads_count 3port ENV.fetch("PORT") { 3000 } 4environment ENV.fetch("RAILS_ENV") { "production" } 5# environment ENV.fetch("RAILS_ENV") { "development" } 6plugin :tmp_restart 7 8app_root = File.expand_path("../..", __FILE__) 9bind "unix://#{app_root}/tmp/sockets/puma.sock" 10 11stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true

試したこと

https://github.com/lynndylanhurley/devise_token_auth/pull/1550/files
どうやら、gem devise_token_auth のコミット 1a0483fbd125 の ja.yml には構文ミスがあり、8月20日に修正されているようです。
しかし、私の場合、エラーが直りませんでした。githubの修正箇所を確認しましたが、24行目の修正がされているようです。
私のエラーメッセージを見ると、「line 20 column 7」とあるので関係性が分かりませんでした。ここで以下のことを試みました。

1 devise_token_authのバージョン確認

 最新のgithubに上がっているバージョンを確認しましたが、1.2.0が最新の状態だと思われます。
https://qiita.com/sayama0402/items/c0ecd9adc141df4b2b60
こちらの記述にもありますが、Rails7系を使う場合
gem 'devise_token_auth', '>= 1.2.0', git: "https://github.com/lynndylanhurley/devise_token_auth"
のように指定している(する必要がある)ので、私のdevise_token_auth'は最新で、恐らく修正が反映されているはずです。しかし、なぜかエラーが出てしまっている状態です。

2 docker-compose.production.ymlのパスを確認

yml

1command: bash -c "rm -f tmp/pids/server.pid && bundle exec puma -C config/puma.rb -e production"

ここのコマンドの
bundle exec puma -C config/puma.rb -e production
という部分が私のディレクトリ構造と違うため以下のように書き直しました。

yml

1command: bash -c "rm -f tmp/pids/server.pid && bundle exec puma -C ./backend/config/puma.rb -e production"

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

yml

1api_1 | bundler: failed to load command: puma (/usr/local/bundle/bin/puma) 2api_1 | /usr/local/bundle/gems/puma-5.6.4/lib/puma/dsl.rb:83:in `read': No such file or directory @ rb_sysopen - ./backend/config/puma.rb (Errno::ENOENT)

エラーから推測するにどうやら修正した./backend/config/puma.rbというパスが間違っている?ようです。docker-compose.production.ymlからpuma.rbファイルをみた場合、修正したパスの方が正しいはずなのですが、どうやら修正前の方で正常に動いている?ようです。*もしかするとこちらのパスが合っていて次の新しいエラーが出ているのかもしれないと思い、./backendddd/config/puma.rbのように存在しないパスを指定してみたのですが、同じエラーが出ました。よってパスの問題ではないように見えます。

3ローカル環境での起動

 ローカル環境では正常に動作します。本番環境用との違いはnginxを入れたことくらいです。ちなみにweb(nginx)は起動はします。しかし、すぐにrailsのコンテナがエラー(上と同じ)を吐きすぐに停止してしまいます。

そのため、nginxの画面に行ってもBad Gatewayになってしまい、railsとnginxのコンテナが正常に動いているかどうか分かりません。ですが、

yml

1senseiy@senseIY-wsl:~/Studio/reDictum_ver-2.0$ docker-compose -f docker-compose.production.yml exec web nginx -t 2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 3nginx: configuration file /etc/nginx/nginx.conf test is successful 4senseiy@senseIY-wsl:~/Studio/reDictum_ver-2.0$ docker-compose -f docker-compose.production.yml exec web curl example.com 5<!doctype html> 6<html> 7<head> 8<title>Example Domain</title> 9 10<meta charset="utf-8" /> 11<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 12<meta name="viewport" content="width=device-width, initial-scale=1" /> 13<style type="text/css"> 14body { 15background-color: #f0f0f2; 16margin: 0; 17padding: 0; 18font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; 19 20} 21div { 22width: 600px; 23margin: 5em auto; 24padding: 2em; 25background-color: #fdfdff; 26border-radius: 0.5em; 27box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); 28} 29a:link, a:visited { 30color: #38488f; 31text-decoration: none; 32} 33@media (max-width: 700px) { 34div { 35margin: 0 auto; 36width: auto; 37} 38} 39</style> 40</head> 41 42<body> 43<div> 44<h1>Example Domain</h1> 45<p>This domain is for use in illustrative examples in documents. You may use this 46domain in literature without prior coordination or asking for permission.</p> 47<p><a href="https://www.iana.org/domains/example">More information...</a></p> 48</div> 49</body> 50</html>

この結果からnginxは作動はしていると考えました。つまり、今起きているのはpumaコマンドを読み込まないというエラーとなぜか発生するymlのシンタックスエラーのみ(これから追加で出てくるかもしれませんが)になります。また、この時

wsl

1docker-compose -f docker-compose.production.yml up

のように動かしています。
また、RAILS_ENV=productionをつけても($ docker-compose -f docker-compose.production.yml run api RAILS_ENV=produc
tion)

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

のようになります。

なぜかファイルエラーが出てしまう

イメージ説明

このファイルを削除してもエラーは変わりませんでした。
・何かしらアドバイスがあればよろしくお願いいたします。

追記

yml

1api_1 | /usr/local/lib/ruby/3.1.0/psych.rb:455:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 20 column 7 (Psych::SyntaxError)

というエラーも出ていました。こちらもline 20 column 7 (Psych::SyntaxError)というymlのシンタックスエラーのようです。しかし、私のローカル環境には/usr/local/lib/ruby/3.1.0/psych.rbというファイルは見つかりませんでした。また、line 20 column 7とあるので先に示したdevise_token_authのエラーともなにかしら関係があるかもしれません。
ですが、もしdevise_token_authのエラーならばローカル環境でも同じエラーが出るはずです。ローカル環境でこのエラーは確認できませんでした。

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

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

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

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

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

guest

回答1

0

自己解決

docker-compose -f docker-compose.production.yml build --no-cache

で再度ビルドしたところエラーがなくなりました。--no-cacheをつけていなかったため、新しくgemが再インストールされなかったようです。つまり、このエラーはdevise_token_authの再インストールで直ると思われます。皆様貴重なお時間を割いて頂きありがとうございました。

投稿2022/08/25 23:43

senseIY

総合スコア281

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問