[RUBY] Beim Umgang mit wann immer in Docker Keine solche Datei oder Verzeichnis --crontab

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.

Umgebung

Ruby 2.5.1 Rails 5.2.4.3

Was du machen willst

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.

Modell und Controller erstellen

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

Immer einstellen

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.

Cron installieren

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.

Starten Sie cron

Ü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!

Aufgabe

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

Beim Umgang mit wann immer in Docker Keine solche Datei oder Verzeichnis --crontab
Umgang mit Composer-Installationsfehlern in Docker
PG :: ConnectionBad: Verbindung zum Server konnte nicht hergestellt werden: Keine solche Datei oder kein solches Verzeichnis
Der Versuch, das Gnome-Terminal im Docker-Container auszuführen, schlägt fehl (Fehler beim Ausführen des untergeordneten Prozesses "dbus-launch" (keine solche Datei oder kein solches Verzeichnis))
Fehler bei der Installation von Docker (Sie müssen Bundler 2 oder höher für diese Sperrdatei verwenden.)
Wenn im Docker-Protokoll keine Ausgabe für stdout vorhanden ist
Die Installation von rbenv 2.7.1 schlägt fehl, wenn "kein akzeptabler C-Compiler in $ PATH gefunden wurde" und "eine solche Datei nicht geladen werden kann".
Führen Sie Rails immer im Docker aus
[Docker] Wird immer mit Docker + Rails verwendet