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