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

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

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

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

Docker

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

Q&A

解決済

1回答

3851閲覧

rails gem wheneverで設定したスケジュールが動作しません(開発環境: Docker)

mofuko

総合スコア13

Ruby on Rails

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

Docker

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

0グッド

0クリップ

投稿2020/06/24 23:16

編集2020/06/24 23:28

前提・実現したいこと

railsでgem wheneverを使用し、バッチ処理を実現したいです。開発環境にはDockerを使用しています。
cron起動後に発生するエラーログに対して、Qiita記事等を参考にしながら対応し、cronを再起動していますが、エラーの内容が全く変わりません。
どんな修正が必要か、ご教示いただきたいです。宜しくお願い致します。

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

log/crontab.log

bundler: failed to load command: bin/rails (bin/rails)

log/crontab_error.log

ActiveRecord::AdapterNotSpecified: 'production' database is not configured. Available: ["default", "development", "test"]

該当のソースコード

schedule.rb

ruby

1set :output, error: 'log/crontab_error.log', standard: 'log/crontab.log' 2set :enviroment, :development 3ENV.each { |k, v| env(k, v) } # 環境変数を渡す記述をしました。 4 5every 1.minutes do 6 runner "TaskMailer.notify_mail" 7end

'production'データベースが構成されていません。というエラーの内容だったので、database.ymlに'production'データベースを構成する記述を追記しました。

database.yml

ruby

1default: &default 2 adapter: postgresql 3 encoding: unicode 4 host: db 5 username: postgres 6 password: 7 pool: 5 8development: 9 <<: *default 10 database: myapp_development 11test: 12 <<: *default 13 database: myapp_test 14production: 15 <<: *default 16 database: myapp_production 17 username: myapp 18 password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

Docker環境でrailsを立ち上げているので、dockerも記載します。

Dockerfile

FROM ruby:2.6.5 RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN mkdir /myapp RUN apt-get install -y cron WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # 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 RUN bundle exec whenever --update-crontab CMD ["cron", "-f"]

docker-compose.yml

version: '3' services: db: image: postgres environment: POSTGRES_HOST_AUTH_METHOD: 'trust' volumes: - ./tmp/db:/var/lib/postgresql/data web: tty: true stdin_open: true build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp - /myapp/vendor - /myapp/tmp - /myapp/log - /myapp/.git ports: - "3000:3000" depends_on: - db

試したこと

  • Docker環境だとcronが動かないようなので、こちらの記事を参考にDocerfile、schedule.rb、docker-compose.ymlファイルの設定を行いました。

  • エラー発生に対し、ファイルを修正後はcrontabに再登録、cronの再起動を実行しています。

(上記のコードは修正済みのものです。)

  • database.ymlファイル修正後は、
docker-compose run web rake db:create

を実行し、問題なくデータベースを作成できていることを確認しました。

補足情報

参考にした記事

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

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

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

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

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

guest

回答1

0

自己解決

busyboxというプログラムに含まれるcrondを利用することで、cronジョブを仕込むことができました。
参考になった記事

投稿2020/06/25 07:45

編集2020/06/25 07:47
mofuko

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問