[RUBY] Lorsque vous traitez à tout moment dans Docker Aucun fichier ou répertoire de ce type --crontab

Gemme pratique "à tout moment" qui vous permet d'écrire facilement le traitement planifié

Lors de la création d'une application avec docker, j'ai essayé de traiter à chaque fois, mais j'ai trébuché, donc je vais l'écrire sous forme de mémorandum.

environnement

Ruby 2.5.1 Rails 5.2.4.3

Chose que tu veux faire

Cette fois, préparez un modèle appelé post et utilisez-le à chaque minute pour créer un post chaque minute. Commencez comme si la construction de l'environnement docker était terminée.

Créer un modèle et un contrôleur

Sur docker

root@6181bdf78fa7:/myapp# bundle exec rails g model post name:string 
root@6181bdf78fa7:/myapp# bundle exec db:migrate
root@6181bdf78fa7:/myapp# bundle exec rails g controller posts

Toujours réglage

Installez d'abord la gemme

Gemfile


gem 'whenever', require: false

Après avoir reconstruit et installé le gem, exécutez la commande pour créer un fichier

root@6181bdf78fa7:/myapp# bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!

Nous traiterons le schedule.rb créé.

schedule.rb


require File.expand_path(File.dirname(__FILE__) + "/environment")
set :environment, :development
set :output, 'log/cron.log'
ENV.each { |k, v| env(k, v) }

every 1.minutes do
  runner "Post.create"
end

Lorsque vous atteignez ce point, reflétez les paramètres dans cron

root@6181bdf78fa7:/myapp# bundle exec whenever --update-crontab
bundler: failed to load command: whenever (/usr/local/bundle/bin/whenever)
Errno::ENOENT: No such file or directory - crontab
  /usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:77:in `popen'
  /usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:77:in `write_crontab'
  /usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:38:in `run'
  /usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:6:in `execute'
  /usr/local/bundle/gems/whenever-1.0.0/bin/whenever:44:in `<top (required)>'
  /usr/local/bundle/bin/whenever:23:in `load'
  /usr/local/bundle/bin/whenever:23:in `<top (required)>'

Vous avez une erreur. En tant que débutant cron, je suis tombé ici.

Installer cron

Apparemment, je dois installer cron dans l'environnement docker, alors décrivez le traitement requis pour l'installation dans le fichier docker. Cette fois, j'ai ajouté une ligne comme celle-ci.

FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN apt-get install -y cron  #Ajouter cette ligne
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
root@6710f08a3504:/myapp# bundle exec whenever --update-crontab
[write] crontab file updated

Il a été mis à jour avec succès et reflété dans cron. Je pense que le traitement automatique a commencé, alors j'attendrai un peu ...

… Apparemment, ça ne marche pas. Si chaque fois fonctionne, clog / cron.log doit être créé.

Démarrer cron

Vérifiez l'état car cron n'est pas en cours d'exécution.

root@827fe138767f:/myapp# service cron status
[FAIL] cron is not running ... failed!

Après tout, cela ne fonctionnait pas. Commençons.

root@827fe138767f:/myapp# service cron start 
[ ok ] Starting periodic command scheduler: cron.

1 minute plus tard ...

cron.log


Running via Spring preloader in process 122

Enfin, cron.log a été généré et le journal a été écrit. Vérifiez auprès de la console des rails.

root@827fe138767f:/myapp# bundle exec rails c
Running via Spring preloader in process 135
Loading development environment (Rails 5.2.4.3)
irb(main):001:0> Post.all.count
   (4.5ms)  SELECT COUNT(*) FROM "posts"
=> 1

Vous pouvez voir que les données ont été générées!

Tâche

Cependant, il est difficile de démarrer cron manuellement à chaque fois, donc si possible, j'aimerais le décrire dans le fichier docker afin qu'il démarre automatiquement. Je pense que j'ajouterai la méthode à l'avenir.

Recommended Posts

Lorsque vous traitez à tout moment dans Docker Aucun fichier ou répertoire de ce type --crontab
Aucun fichier ou répertoire de ce type @ rb_sysopen- / Users / ○○ / Gemfile.lock (Errno :: ENOENT) n'a souffert
Traiter les erreurs d'installation de composer dans Docker
PG :: ConnectionBad: impossible de se connecter au serveur: aucun fichier ou répertoire de ce type
La tentative d'exécution de gnome-terminal dans le conteneur Docker échoue (échec de l'exécution du processus enfant «dbus-launch» (aucun fichier ou répertoire de ce type))
Erreur lors de l'installation de Docker (vous devez utiliser Bundler 2 ou supérieur avec ce fichier de verrouillage.)
Lorsqu'il n'y a pas de sortie vers stdout dans le journal du docker
rbenv install 2.7.1 échoue avec "aucun compilateur C acceptable trouvé dans $ PATH" et "ne peut pas charger un tel fichier"
Exécuter des rails à chaque fois dans le docker
[Docker] À utiliser à tout moment avec Docker + Rails