Praktisches Juwel "wann immer", mit dem Sie die geplante Verarbeitung einfach schreiben können
Beim Erstellen einer Anwendung mit Docker habe ich versucht, sie mit wann immer zu verarbeiten, bin jedoch gestolpert, sodass ich sie als Memorandum schreiben werde.
Ruby 2.5.1 Rails 5.2.4.3
Bereiten Sie dieses Mal ein Modell mit dem Namen "Post" vor und erstellen Sie jede Minute einen Post. Beginnen Sie so, als ob die Docker-Umgebungskonstruktion abgeschlossen ist.
Auf 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
Installieren Sie zuerst den Edelstein
Gemfile
gem 'whenever', require: false
Führen Sie nach dem Wiederherstellen und Installieren des Gems den Befehl aus, um eine Datei zu erstellen
root@6181bdf78fa7:/myapp# bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!
Wir werden den erstellten Schedule.rb verarbeiten.
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
Wenn Sie diesen Punkt erreicht haben, spiegeln Sie die Einstellungen in cron wider
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)>'
Du hast einen Fehler bekommen. Als Cron-Anfänger bin ich hier gestolpert.
Anscheinend muss ich cron in der Docker-Umgebung installieren. Beschreiben Sie daher die für die Installation erforderliche Verarbeitung in der Docker-Datei. Diesmal habe ich eine Zeile wie diese hinzugefügt.
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 #Fügen Sie diese Zeile hinzu
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
Es wurde erfolgreich aktualisiert und in cron wiedergegeben. Ich denke, dass die automatische Verarbeitung begonnen hat, also werde ich eine Weile warten ...
… Anscheinend funktioniert es nicht. Wenn es funktioniert, sollte clog / cron.log erstellt werden.
Überprüfen Sie den Status, da cron nicht ausgeführt wird.
root@827fe138767f:/myapp# service cron status
[FAIL] cron is not running ... failed!
Immerhin hat es nicht funktioniert. Fangen wir an.
root@827fe138767f:/myapp# service cron start
[ ok ] Starting periodic command scheduler: cron.
1 Minute später ...
cron.log
Running via Spring preloader in process 122
Schließlich wurde cron.log generiert und das Protokoll geschrieben. Überprüfen Sie mit der Schienenkonsole.
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
Sie können sehen, dass die Daten generiert wurden!
Es ist jedoch mühsam, cron jedes Mal manuell zu starten. Wenn möglich, möchte ich es in der Docker-Datei beschreiben, damit es automatisch gestartet wird. Ich denke, ich werde die Methode in Zukunft hinzufügen.
Recommended Posts