Docker konteynerinin içinde cron işi nasıl çalıştırılır?


275

Bir kabuk komut dosyası çağıran bir docker konteyner içinde bir cronjob çalıştırmak çalışıyorum.

Dün tüm web üzerinde arama yapıyorum ve yığın taşması yaptım, ancak gerçekten işe yarayan bir çözüm bulamadım.
Bunu nasıl yapabilirim?

DÜZENLE:

Verilen aralıkta bir kabuk komut dosyası çağıran bir çalışma docker cron konteyner ile (yorum) github deposu oluşturdum .

Yanıtlar:


365

Söz konusu görüntüden başlatılan kabın işi yürütmesi için crontab'ınızı bir görüntüye kopyalayabilirsiniz.

Bkz: " Docker ile bir cron işi çalıştırın gelen" Julien Boulay'in onun içinde Ekito/docker-cron:

hello-cronİşimizi tanımlamak için " " adında yeni bir dosya oluşturalım .

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.

Aşağıdaki Dockerfile resminizi oluşturmak için tüm adımları açıklar

FROM ubuntu:latest
MAINTAINER docker@ekito.fr

RUN apt-get update && apt-get -y install cron

# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

(bkz Gaafar 'ın yorumunu ve nasıl yapabilirim apt-getaz gürültülü yüklemek? :
apt-get -y install -qq --force-yes cronçok çalışabilir)

Tarafından belirtildiği gibi Nathan Lloyd içinde yorumlarla :

Bir gotcha hakkında hızlı not:
Bir komut dosyası ekliyorsanız ve cron'a çalıştırmasını söylüyorsanız, unutursanız Cron'un sessizce başarısız olduğunu unutmayın .
RUN chmod 0744 /the_script


VEYA, hugoShaka'da açıklandığı gibi, işinizin kendisinin bir günlük dosyası yerine doğrudan stdout / stderr'e yönlendirdiğinden emin olun 'ın cevabı :

 * * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2

Son Dockerfile satırını

CMD ["cron", "-f"]

Ayrıca bakınız (hakkında cron -f, cron "ön plan" demek) docker ubuntucron -f çalışmıyor "


Oluşturun ve çalıştırın:

sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example

Sabırlı olun, 2 dakika bekleyin; komut satırınızda şunlar görünmelidir:

Hello world
Hello world

Eric ekliyor yorumlarda :

Unutmayın tail it görüntü oluşturma sırasında oluşturulursa doğru dosyayı göstermeyebilir.
Bu durumda, kuyruğun doğru dosyayı alması için kap çalışma zamanı sırasında dosyayı oluşturmanız veya dokunmanız gerekir.

Bkz. "Bağlantı biriminin sonundaki çıktı gösterilmiyortail -fCMD ".


1
Dahil olmadığı için ilk olarak cron'u kurmuştum. Ancak bunu Dockerfile'a ekleyerek çalışır. Teşekkürler! RUN apt-get update && apt-get install cron
C Heyer

2
-ydocker derlemesinin çıkmasını önlemek için muhtemelen cron kurulumuna eklemelisiniz
gafi

1
@Gaafar Doğru! Daha fazla görünürlük için yorumunuzu cevaba ekledim ve başka bir seçenek ekledim.
VonC

6
Bu çözüm hala çalışıyor mu? Ben kökü ve türü olarak kabın içine giriş yaptığınızda, verilen yönergeleri izlediğinizde crontab -l, benim hemen kökü için yüklü crontab , ayrıca, ekranım açılmıyorsa. Ancak, '/etc/cron.d/' işaretini kontrol ettiğimde, crontab alanın orada olduğunu görüyorum (ve daha da şaşırtıcı bir şekilde), kontrol /var/log/cron.logettiğimde betiğin çalıştığını görüyorum (dosya içeriği ekleniyor Hello World). Benim Dockerfile Bu resmi çekiyorum: FROM phusion/baseimage:0.10.0. Davranıştaki tutarsızlık hakkında herhangi bir fikir var mı?
Homunculus Reticulli

11
2018 itibariyle bu yaklaşım artık işe yaramıyor; Herkes cronjob temel görüntü olarak Ubuntu ile çalışmak için elde edebildi mi? Kutusundan çıkan cron ile birlikte gelen Alp görüntüsü ile ilgilenmiyorum
pelikan

147

Kabul edilen çözüm bir üretim ortamında tehlikeli olabilir .

Docker'da kap başına yalnızca bir işlem yürütmelisiniz, çünkü yapmazsanız çatallanan ve arka plana giden işlem izlenmez ve siz bilmeden durabilir.

Arka planda CMD cron && tail -f /var/log/cron.logyürütmek için cron işlemini temel olarak çatal kullandığınızda , cronana işlem çıkar ve tailfön planda yürütmenizi sağlar . Arka plan cron işlemi durdurulabilir veya başarısız olabilir, fark etmezsiniz, kapsayıcınız yine de sessizce çalışır ve düzenleme aracınız yeniden başlatmaz.

Eğer docker doğrudan cron'u en komutları çıkışını yönlendirerek böyle bir şeyi önleyebilirsiniz stdoutve stderrsırasıyla bulunur /proc/1/fd/1ve /proc/1/fd/2.

Temel kabuk yönlendirmelerini kullanarak şöyle bir şey yapmak isteyebilirsiniz:

* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2

Ve CMD'niz: CMD ["cron", "-f"]


14
Nice: cron -f"cron ön planı" içindir. Daha fazla görünürlük için cevabınızı yukarıdaki benimkine ekledim. +1
VonC

Diyelim ki programımın çıktısı yok. Yine de bu yöntemi kullanabilir miyim ve işlemimin arka planda durmayacağından emin olabilir miyim?
18:18

1
@Arcsector bu yöntem arka planda bir işlem koymaktan kaçının, bu yüzden sessizce başarısız olmaz. Bağlantı istasyonu kapsayıcısında arka plan işlemi olması basit değildir. Çalışan bir arka plan işlemine sahip olmak istiyorsanız, kapsayıcıda çalıştırdığınız birden çok işlemi izlemek için bir başlatma işlemi kullanmak isteyebilirsiniz. Başka bir yol, süreci 'sepet' adı verilen ana kutunun yanındaki başka bir kapta başlatmaktır. En iyi yol genellikle kapta birden çok işlemden kaçınmaktır.
hugoShaka

Güzel ve temiz! Love it :)
AmaelH

1
Bu iyi bir çözüm ve bizim için bir sorun dışında iyi çalışıyor. Kapsayıcı bir SIGTERM sinyali aldığında, planlanan işlemin bitmesini ve yavaşça kapanmasını beklemiyor gibi görünmektedir, bunun yerine sorunlara neden olabilecek süreci öldürmektedir.
James Hulse

107

Basit ve hafif bir görüntü kullanmak isteyenler için:

FROM alpine:3.6

# copy crontabs for root user
COPY config/cronjobs /etc/crontabs/root

# start crond with log level 8 in foreground, output to stderr
CMD ["crond", "-f", "-d", "8"]

Burada cronjobs , cronjobs'unuzu içeren dosyadır, bu formda:

* * * * * echo "hello stackoverflow" >> /test_file 2>&1
# remember to end this file with an empty new line

10
Basit, hafif ve standart görüntü tabanlı. Bu kabul edilen cevap olmalı. Ayrıca > /proc/1/fd/1 2> /proc/1/fd/2doğrudan docker günlüklerinden cronjobs çıktısına erişmek için yeniden yönlendirmeyi kullanın.
HenriTel

2
Alpine kullanmayan insanlar için: -d 8Parametreyi destekleyen crond standart cron değil, busybox'tan crond komutudur. Örneğin ubuntu'dan bunu olarak çalıştırabilirsiniz busybox crond -f -d 8. Daha eski sürümler için kullanmanız gerekir -L /dev/stdout/.
Trendfischer

2
Yapabilirsem bunu +100 veririm. Bu, bir Docker ortamında cron işlerini çalıştırmanın en iyi yoludur.
Jitsusama

1
Cron işini her değiştirdiğinizde (veya birden fazlasına ihtiyacınız varsa) yeni bir görüntü oluşturmak istemiyorsanız, Alpine'yi çalıştırabilir ve cronu ayarlamak için bir birim kullanabilirsiniz. Ben aşağıdaki kullanarak test ettik: docker run -v ${PWD}/cronjobs:/etc/crontabs/root alpine:3.6 crond -f -d 8. @ Groostav Docker Compose'da benzer bir şey kullanabilirsiniz.
duality_

1
CMD ["crond"veya CMD ["cron"?
codemith

38

@VonC'nin önerdiği şey güzel ama tüm cron işi yapılandırmasını tek bir satırda yapmayı tercih ediyorum. Bu, cronjob konumu gibi platformlar arası sorunları önler ve ayrı bir cron dosyasına ihtiyacınız yoktur.

FROM ubuntu:latest

# Install cron
RUN apt-get -y install cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Setup cron job
RUN (crontab -l ; echo "* * * * * echo "Hello world" >> /var/log/cron.log") | crontab

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

Liman işçisi konteynerinizi çalıştırdıktan sonra, cron servisinin çalışıp çalışmadığından emin olabilirsiniz:

# To check if the job is scheduled
docker exec -ti <your-container-id> bash -c "crontab -l"
# To check if the cron service is running
docker exec -ti <your-container-id> bash -c "pgrep cron"

CMD yerine ENTRYPOINT kullanmayı tercih ediyorsanız, yukarıdaki CMD'yi

ENTRYPOINT cron start && tail -f /var/log/cron.log

1
İlginç bir alternatif. +1
VonC

2
RUN apt-get update && apt-get -y install cronya da başka bir paket bulamazcron
alphabetasoup

2
Teşekkürler Youness, bana her RUN cat $APP_HOME/crons/* | crontab
cronun

bir giriş cronnoktası komut dosyasına eklemek en iyi seçenek gibi görünüyor: ENTRYPOINT ["entrypoint.sh"]
bozdoz

20

Bunu yapmanın başka bir yolu da, cron (zamanlayıcı) desteğine sahip bir görev koşucusu olan Tasker'ı kullanmaktır .

Neden ? Bazen bir cron işi çalıştırmak için, temel imajınızı (python, java, nodejs, ruby) crond ile karıştırmanız gerekir. Bu, korunacak başka bir imaj anlamına gelir. Tasker, crond ve konteynerleri ayırarak bundan kaçının. Sadece komutlarınızı yürütmek istediğiniz görüntüye odaklanabilir ve Tasker'ı onu kullanacak şekilde yapılandırabilirsiniz.

İşte docker-compose.ymlsizin için bazı görevleri çalıştıracak bir dosya

version: "2"

services:
    tasker:
        image: strm/tasker
        volumes:
            - "/var/run/docker.sock:/var/run/docker.sock"
        environment:
            configuration: |
                logging:
                    level:
                        ROOT: WARN
                        org.springframework.web: WARN
                        sh.strm: DEBUG
                schedule:
                    - every: minute
                      task: hello
                    - every: minute
                      task: helloFromPython
                    - every: minute
                      task: helloFromNode
                tasks:
                    docker:
                        - name: hello
                          image: debian:jessie
                          script:
                              - echo Hello world from Tasker
                        - name: helloFromPython
                          image: python:3-slim
                          script:
                              - python -c 'print("Hello world from python")'
                        - name: helloFromNode
                          image: node:8
                          script:
                              - node -e 'console.log("Hello from node")'

Orada 3 görev var, hepsi her dakika çalışacak ( every: minute) ve her biri scriptkodu,image bölüm .

Sadece koşun docker-compose upve çalıştığını görün. İşte Tasker repo ve belgelerin tamamı:

http://github.com/opsxcq/tasker


Dockerception (docker kapsayıcılarını başka bir kaptan çalıştırmak) kötü bir uygulamadır ve sürekli entegrasyonla sınırlandırılmalıdır. docker execBelirtilen kaplarda kullanmak için bir geçici çözüm olacaktır .
HenriTel

1
Tasker docker'da (Dind / Dockerception) docker kullanmaz, docker soketini bir eşleme olarak geçirdiğini, ortaya çıkan tüm kapların, tasker'ın çalıştığı arka plan programında doğduğunu unutmayın. Ve görevlendiriciyi docker'ın içinde çalıştırmak istemiyorsanız, başka bir uygulama olarak dağıtabilirsiniz.
OPSXCQ

1
Tasker kullanmanın avantajlarını elde edemiyorum. Java ve sh *** kullanarak sadece bir cron işi yapmak için bana aşırı bir yük gibi görünüyor.
Karl Adler

İhtiyacınız olan cron ve temel görüntüyü (örneğin python / düğüm) karıştırmak, korunması ve dağıtılması gereken ekstra bir bağımlılık yaratır, bu senaryoda tüm işler aynı kapsayıcıyı paylaşır, bu da her şeyi temizlemekten endişe etmeniz gerektiği anlamına gelir. her iş çalışır. Tasker üzerinde çalışan işler idempotent, bu yüzden endişelenecek daha az şeyiniz var.
OPSXCQ

13

VonC'nin cevabı oldukça kapsamlı. Ayrıca bana yardımcı olan bir şey daha eklemek istiyorum. Bir dosyayı kuyruklamadan yalnızca bir cron işi çalıştırmak istiyorsanız, yalnızca && tail -f /var/log/cron.logcron komutundan kaldırmanız cazip olur .

Ancak bu, Docker kapsayıcısının çalıştırıldıktan kısa bir süre sonra çıkmasına neden olur çünkü cron komutu tamamlandığında, Docker son komutun çıktığını düşünür ve bu nedenle kapsayıcıyı öldürür. Bu, ön planda cron çalıştırılarak önlenebilir cron -f.


9

Her ne kadar bu, Docker'ın bir konteynırda çalışan bir işlemin yanında işleri yürütmeyi amaçlıyor exec arayüzü , bu sizin için ilgi çekici olabilir.

Üst verilerde tanımlanan kapsayıcıları ve işleri zamanlayan bir daemon yazdım. Misal:

version: '2'

services:
  wordpress:
    image: wordpress
  mysql:
    image: mariadb
    volumes:
      - ./database_dumps:/dumps
    labels:
      deck-chores.dump.command: sh -c "mysqldump --all-databases > /dumps/dump-$$(date -Idate)"
      deck-chores.dump.interval: daily

'Klasik', cron benzeri konfigürasyon da mümkündür.

İşte dokümanlar , işte görüntü deposu .


Teşekkür ederim. Bu yanıt, Docker kapsayıcıları ortamı için en doğrudur. Docker görüntülerinde herhangi bir değişiklik yok, sadece görevleri yürütmek için özel kap ekliyor, docker exec <container_name> <some_command>zamanlamaya göre komut gibi çalışıyor .
PRIHLOP

Bu en basit "işi hallet" cevabıdır.
Ibrahim Awad

9

Gibi kullanılabilecek diğer cevaplara dayanarak bir Docker görüntüsü oluşturdum

docker run -v "/path/to/cron:/etc/cron.d/crontab" gaafar/cron

where /path/to/cron: crontab dosyasına giden mutlak yol veya dosyayı bir Dockerfile dosyasında temel olarak kullanabilirsiniz:

FROM gaafar/cron

# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab

# Add your commands here

Referans olarak, görüntü burada .


İlginç bir görüntü. +1
VonC

5

Kapsayıcınızı başka bir ana bilgisayara dağıtırken, işlemin otomatik olarak başlatılmayacağını unutmayın. Konteynerin içinde 'cron' hizmetinin çalıştığından emin olmalısınız. Bizim durumumuzda, cron hizmetini başlatmak için Supervisord'u diğer hizmetlerle kullanıyorum.

[program:misc]
command=/etc/init.d/cron restart
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/misc-cron.err.log
stdout_logfile=/var/log/misc-cron.out.log
priority=998

Supervisor.log dosyasında cron hizmetinin birden çok kez durduğu ve bir FATAL durumuna girdiği konusunda bir hata alıyorum. Bununla birlikte, cron tepede çalışıyor ve normalde cronjobs çalıştırıyor gibi görünüyor. Bunun için teşekkürler!
lephleg

Evet, aynı şey bana da oldu, ama normal olarak çalışıyor, bu yüzden rahatsız etmenize gerek yok.
Sagar Ghuge

5

Komutu hizmetinize docker exec ile çalıştıran özel bir kapta cronjob tanımlayın.

Bu daha yüksek uyumdur ve çalışan komut dosyası, hizmetiniz için tanımladığınız ortam değişkenlerine erişebilir.

#docker-compose.yml
version: "3.3"
services:
    myservice:
      environment:
        MSG: i'm being cronjobbed, every minute!
      image: alpine
      container_name: myservice
      command: tail -f /dev/null

    cronjobber:
     image: docker:edge
     volumes:
      - /var/run/docker.sock:/var/run/docker.sock
     container_name: cronjobber
     command: >
          sh -c "
          echo '* * * * * docker exec myservice printenv | grep MSG' > /etc/crontabs/root
          && crond -f"

Docker sürüsü kullanarak bunu çalıştıramadım. Alma myservice unknownhataları.
Mark Grimes


4

Windows için docker kullanıyorsanız, crontab dosyanızı pencerelerden ubuntu konteynerinize aktarmak istiyorsanız, satır sonu biçiminizi CRLF'den LF'ye (yani dos'dan unix'e) değiştirmeniz gerektiğini unutmayın. Değilse, cron işiniz çalışmaz. İşte çalışan bir örnek:

FROM ubuntu:latest

RUN apt-get update && apt-get -y install cron
RUN apt-get update && apt-get install -y dos2unix

# Add crontab file (from your windows host) to the cron directory
ADD cron/hello-cron /etc/cron.d/hello-cron

# Change line ending format to LF
RUN dos2unix /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/hello-cron.log

# Run the command on container startup
CMD cron && tail -f /var/log/hello-cron.log

Docker kaplarındaki cron işlerinde hata ayıklamak sıkıcı bir iş olduğundan, bu aslında beni anlamaya saatler sürdü. Umarım kodlarını çalıştıramayan başka herkese yardımcı olur!


3

Yukarıdaki örneklerden bu kombinasyonu oluşturdum:

Nano'da Crontab Kullanarak Alpine Image & Edit (I nefret ediyorum vi)

FROM alpine

RUN apk update
RUN apk add curl nano

ENV EDITOR=/usr/bin/nano 

# start crond with log level 8 in foreground, output to stderr
CMD ["crond", "-f", "-d", "8"]

# Shell Access
# docker exec -it <CONTAINERID> /bin/sh

# Example Cron Entry
# crontab -e
# * * * * * echo hello > /proc/1/fd/1 2>/proc/1/fd/2
# DATE/TIME WILL BE IN UTC

2

Bir kerelik bir işe paralel olarak bir cron ayarlama

Periyodik olarak çalışması gereken işle birlikte run.sh adlı bir komut dosyası oluşturun.

#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"

Kaydet ve çık.

CMD yerine Giriş Noktası Kullan

liman işçiliği konteynerleştirmesi sırasında başlayacak birden fazla işiniz varsa, hepsini çalıştırmak için giriş noktası dosyasını kullanın.

Giriş noktası dosyası, bir liman işçisi çalıştırma komutu verildiğinde devreye giren bir komut dosyasıdır. Bu nedenle, çalıştırmak istediğimiz tüm adımlar bu komut dosyasına yerleştirilebilir.

Örneğin, çalışacak 2 işimiz var:

Bir kez çalıştır : echo “Docker konteyneri başlatıldı”

Periyodik işi çalıştır : run.sh

Entrypoint.sh oluştur

#!/bin/bash

# Start the run once job.
echo "Docker container has been started"

# Setup a cron schedule
echo "* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt

crontab scheduler.txt
cron -f

Dosyada ayarlanmış olan crontab'ı anlayalım

* * * * *: Cron programı; iş her dakika yapılmalıdır. Gereksiniminize göre programı güncelleyebilirsiniz.

/run.sh: Periyodik olarak çalıştırılacak olan komut dosyasının yolu

/var/log/cron.log: Zamanlanan cron işinin çıktısını kaydetmek için dosya adı.

2>&1: Hata günlükleri (varsa) yukarıda kullanılan çıktı dosyasına da yönlendirilecektir.

Not : Ek bir yeni satır eklemeyi unutmayın, çünkü geçerli bir cron yapar. Scheduler.txt: cron kurulumunun tamamı bir dosyaya yönlendirilecektir.

Cron'da Sistem / Kullanıcıya özgü ortam değişkenlerini kullanma

Gerçek cron işim, ortam değişkenleri docker run komutuna iletilirken argümanların çoğunu bekliyordu. Ancak bash ile, sisteme veya docker konteynerine ait ortam değişkenlerini kullanamadım.

Sonra bu, bu soruna bir çözüm olarak ortaya çıktı:

  1. Entrypoint.sh dosyasına aşağıdaki satırı ekleyin
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
  1. Cron kurulumunu güncelleyin ve
SHELL=/bin/bash
BASH_ENV=/container.env

Sonunda, entrypoint.shşöyle görünmelisin

#!/bin/bash

# Start the run once job.
echo "Docker container has been started"

declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env

# Setup a cron schedule
echo "SHELL=/bin/bash
BASH_ENV=/container.env
* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt

crontab scheduler.txt
cron -f

Son fakat en az değil: Dockerfile oluşturun

FROM ubuntu:16.04
MAINTAINER Himanshu Gupta

# Install cron
RUN apt-get update && apt-get install -y cron

# Add files
ADD run.sh /run.sh
ADD entrypoint.sh /entrypoint.sh

RUN chmod +x /run.sh /entrypoint.sh

ENTRYPOINT /entrypoint.sh

Bu kadar. Docker görüntüsünü oluşturun ve çalıştırın!


1
@himanshuIIITian Ben denedim, sorun "bir kez iş çalıştırmak" komut dosyası asla geri dönmüyor ve ayrıca mısır -f geri dönmüyor ... bu benim için çalışmıyor, herhangi bir fikir? teşekkürler
Doron Levi

@DoronLevi - soruna bakmak için bazı günlükleri paylaşabilir misiniz? Veya tüm kodu buradan kontrol edebilirsiniz - github.com/nehabhardwaj01/docker-cron
himanshuIIITian

Geri dönüşünüz için teşekkür ederiz. Cevabın faydalı olduğuna sevindim.
himanshuIIITian

1

Cron işleri / var / spool / cron / crontabs (Bildiğim tüm dağıtımlarda ortak yer) içinde saklanır. BTW, Böyle bir şey kullanarak bash'da bir cron sekmesi oluşturabilirsiniz:

crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample

Bu, cron görevi olan geçici bir dosya oluşturur, ardından crontab kullanarak programlar. Son satır geçici dosyayı kaldır.


cronArtalan normal olarak bir kap içinde çalışmaz.
Mat

@BhargavNanekalva, bu cevabın ele almadığı bir kapta özel olarak kurulmalıdır.
Matt

@Matt, kapta tam olarak nasıl belirtilmesi gerektiğini lütfen anlatabilir misiniz? . Crontab -l yapıyorum ve komut gösteriliyor - kagda.ru/i/6d014816d43_29-06-2017-11:38:59_6d01.png ama hala çalışmıyor
Tebe

@ Копать_Шо_я_нашел Koşmak zorundasın crond hizmete ek olarak, normalde s6 gibi bir hizmet yöneticisiyle de çalışmanız gerekir. Muhtemelen doğru bir cevap almak için bir soru olarak sorun
Matt

1

Kök erişimini kısıtlayan bazı kesilmiş görüntüler üzerinde çalışırken, kullanıcımı sudo kullanıcılarına eklemek ve sudo cron

FROM node:8.6.0
RUN apt-get update && apt-get install -y cron sudo

COPY crontab /etc/cron.d/my-cron
RUN chmod 0644 /etc/cron.d/my-cron
RUN touch /var/log/cron.log

# Allow node user to start cron daemon with sudo
RUN echo 'node ALL=NOPASSWD: /usr/sbin/cron' >>/etc/sudoers

ENTRYPOINT sudo cron && tail -f /var/log/cron.log

Belki bu birine yardım eder


Düğüm görüntüsünün düğüm kullanıcısını kullandığına inanıyorum; bu yüzden belki de bu kullanıcı için izin eklemeniz gerekiyor
bozdoz

1

Benim sorunum aynıydı. Düzeltme, komut bölümündeki komut bölümünü değiştirmekti.docker-compose.yml .

itibaren

komut: crontab / etc / crontab && tail -f / etc / crontab

için

komut: crontab / etc / crontab

komut: kuyruk -f / etc / crontab

Sorun komutları arasında '&&' oldu. Bunu sildikten sonra her şey yolundaydı.


-1

Şimdiye kadar bulduğum en sağlam yol bağımsız bir cron konteyneri çalıştırmaktır - docker istemcisini kurun ve ana makine üzerindeki docker sunucusuyla konuşabilmek için docker çorapını bağlayın.

Sonra sadece / c / crontab oluşturmak için her cron işi için env vars ve bir giriş noktası komut dosyası kullanın

İşte bu prensibi kullanarak ve bunu son 3-4 yıldır üretimde kullandığım bir imaj.

https://www.vip-consult.solutions/post/better-docker-cron#content


Yanıtlar bağımsız olmalı ve dış kaynaklara bağlanmamalıdır
Nicolas Bouliane

-2

Görevleri zamanlamak için clockwork gem'i kullanmayı deneyin. Bu bağlantıda verilen adımları izleyin.

http://fuzzyblog.io/blog/rails/2017/05/11/adding-cron-to-a-dockerized-rails-application-using-clockwork.html

Lib / clock.rb dosyasının içindeki komisyon görevini aşağıdaki gibi çağırabilirsiniz.

every(1.day, 'Import large data from csv files', :at => '5:00') do |job|
  `rake 'portal:import_data_from_csv'`
end

Docker-compose dosyasında ayrı bir kap oluşturun ve kap içinde aşağıdaki komutu çalıştırın.

command: bundle exec clockwork lib/clock.rb

1
Zamanlama için başka bir araç kullanmak güzel bir fikir. Ancak, bu soru özellikle cron için sordu, bu yüzden öneri, bence soruya bir yorum olarak daha iyi olurdu.
Richard Kiefer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.