前提
現在こちらのサイトを参考に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>'
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 config/puma.rb -e production" volumes: - ./backend:/myapp - ./backend/vendor/bundle:/myapp/vendor/bundle environment: TZ: Asia/Tokyo RAILS_ENV: development # 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系です
なぜこのようなエラーが発生してしまうのでしょうか?何かしらアドバイスがあればよろしくお願いいたします。欠けている情報があれば追記いたします。
0 コメント