J'ai essayé d'utiliser every
qui exécute Rails régulièrement, mais j'ai décidé de le faire avec docker car il était difficile de gérer les variables d'environnement et les autorisations lors de sa mise en œuvre directement sur Mac.
L'environnement d'exécution est le suivant ・ Rubis 2.6.3 ・ Rails 5.2.4 · MySQL 8.0.19
Dockfile
, docker-compose.yml
ressemble à ceci
Ce n'est pas très différent des paramètres de docker normaux, mais comme nous l'utilisons à chaque fois, nous avons ajouté les paramètres pour installer corn
et exécuter cron au premier plan.
FROM ruby:2.6.3
#spécification de la version ruby
#installation de gemmes
RUN apt-get update -qq && \
apt-get install -y build-essential \
libpq-dev \
nodejs
#installation de cron
RUN apt-get install -y cron
RUN mkdir /my_app
WORKDIR /my_app
COPY Gemfile /my_app/Gemfile
COPY Gemfile.lock /my_app/Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /my_app
#Écrire crontab avec chaque fois
RUN bundle exec whenever --update-crontab
#Exécutez cron au premier plan
CMD ["cron", "-f"]
docker-compose.yml
version: '2'
services:
db:
image: mysql:8.0.19
command:
--default-authentication-plugin=mysql_native_password
volumes:
- ./mysql-confd:/etc/mysql/conf.d
- mysql-data:/var/lib/mysql #Pour la persistance des données
ports:
- "3306:3306"
restart: always
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 1
# MYSQL_DATABASE: app_development
MYSQL_USER: root
# MYSQL_PASSWORD: password
TZ: Asia/Tokyo
app:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/my_app
- bundle:/usr/local/bundle
ports:
- "3000:3000"
links:
- db
volumes:
mysql-data:
bundle: #Vous n'avez pas besoin de reconstruire après l'installation du bundle
config/schedule.rb
#Rails parce que vous devez démarrer les rails à tout moment.Utiliser la racine
require File.expand_path(File.dirname(__FILE__) + "/environment")
#Il fait bien les variables d'environnement
ENV.each { |k, v| env(k, v) }
#Fichier pour écrire des journaux
set :output, error: 'log/crontab_error.log', standard: 'log/crontab.log'
set :environment, :development
#Toutes les 2 minutes`sample_task`de`scheduled_task`Courir
every 2.minutes do
rake 'sample_task:scheduled_task'
# runner "Test.yakisoba", :environment => :development #exemple de coureur
end
/lib/tasks/sample_task.rb
namespace :sample_task
desc "scheduled_task"
task scheduled_task: :environment do
.....Fonction que vous souhaitez exécuter
end
end
end
Recommended Posts