Bagaimana menjalankan pekerjaan cron di dalam wadah buruh pelabuhan?

275

Saya mencoba menjalankan cronjob di dalam wadah buruh pelabuhan yang memanggil skrip shell.

Kemarin saya telah mencari di seluruh web dan stack overflow, tetapi saya tidak dapat menemukan solusi yang berfungsi.
Bagaimana saya bisa melakukan ini?

EDIT:

Saya telah membuat repositori github (berkomentar) dengan wadah cron docker yang berfungsi yang memanggil skrip shell pada interval yang diberikan.

C Heyer
sumber

Jawaban:

365

Anda dapat menyalin crontab Anda ke dalam gambar, agar wadah diluncurkan dari gambar tersebut untuk menjalankan pekerjaan.

Lihat " Jalankan pekerjaan cron dengan Docker " dari Julien Boulay dalam bukunya Ekito/docker-cron:

Mari kita buat file baru yang disebut " hello-cron" untuk menggambarkan pekerjaan kita.

* * * * * 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.

Dockerfile berikut menjelaskan semua langkah untuk membangun gambar Anda

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

(lihat Gaafar 's komentar dan Bagaimana cara membuat apt-getinstall kurang bising? :
apt-get -y install -qq --force-yes cron dapat bekerja juga)

Seperti yang dicatat oleh Nathan Lloyd dalam komentar :

Catatan singkat tentang gotcha:
Jika Anda menambahkan file skrip dan menyuruh cron untuk menjalankannya, ingatlah untuk Cron gagal secara diam-diam jika Anda lupa .
RUN chmod 0744 /the_script


OR, pastikan pekerjaan Anda sendiri mengarahkan langsung ke stdout / stderr bukan file log, seperti yang dijelaskan dalam hugoShaka 's jawabannya :

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

Ganti baris Dockerfile terakhir dengan

CMD ["cron", "-f"]

Lihat juga (tentang cron -f, yang mengatakan cron "foreground") " docker ubuntu cron -ftidak berfungsi "


Bangun dan jalankan:

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

Bersabarlah, tunggu 2 menit dan baris perintah Anda akan ditampilkan:

Hello world
Hello world

Eric menambahkan dalam komentar :

Perhatikan bahwa tailmungkin tidak menampilkan file yang benar jika dibuat selama pembuatan gambar.
Jika itu masalahnya, Anda harus membuat atau menyentuh file selama runtime kontainer agar ekor untuk mengambil file yang benar.

Lihat " Output tail -fpada akhir buruh pelabuhan CMDtidak ditampilkan ".

VONC
sumber
1
Saya harus menginstal cron terlebih dahulu, karena tidak termasuk. Tetapi dengan menambahkan ini ke Dockerfile berfungsi. Terima kasih! RUN apt-get update && apt-get install cron
C Heyer
2
Anda mungkin harus menambahkan -yuntuk menginstal cron untuk menghindari keluar bangunan buruh pelabuhan
gafi
1
@ Gaafar Benar! Saya telah memasukkan komentar Anda dalam jawaban untuk lebih banyak visibilitas dan menambahkan opsi lain.
VonC
6
Apakah solusi ini masih berfungsi? Ketika saya mengikuti pedoman yang diberikan, ketika saya login ke wadah sebagai root dan ketik crontab -l, saya tidak menginstal crontab untuk root , juga, layar saya tetap kosong. Namun, ketika saya mencentang '/etc/cron.d/', saya melihat crontab ada di sana (dan bahkan lebih mengejutkan), ketika saya periksa /var/log/cron.log, saya melihat bahwa skrip sedang berjalan (isi file sedang ditambahkan dengan Hello World). Aku menarik gambar ini di Dockerfile saya: FROM phusion/baseimage:0.10.0. Adakah gagasan tentang perbedaan perilaku?
Homunculus Reticulli
11
Pada 2018, pendekatan ini tidak lagi berfungsi; Adakah yang bisa membuat cronjob mereka bekerja dengan Ubuntu sebagai gambar dasar? Saya tidak tertarik pada gambar Alpine yang datang dengan cron kehabisan kotak
pelican
148

Solusi yang diadopsi mungkin berbahaya di lingkungan produksi .

Di buruh pelabuhan, Anda hanya boleh menjalankan satu proses per kontainer karena jika tidak, proses yang bercabang dan pergi latar tidak dipantau dan mungkin berhenti tanpa Anda sadari.

Ketika Anda menggunakan CMD cron && tail -f /var/log/cron.logproses cron pada dasarnya bercabang untuk mengeksekusi crondi latar belakang, proses utama keluar dan membiarkan Anda mengeksekusi tailfdi latar depan. Proses latar belakang cron bisa berhenti atau gagal Anda tidak akan melihat, wadah Anda akan tetap berjalan diam-diam dan alat orkestrasi Anda tidak akan memulai kembali.

Anda dapat menghindari hal itu dengan mengarahkan langsung output perintah cron ke buruh pelabuhan Anda stdoutdan stderryang masing-masing terletak di /proc/1/fd/1dan /proc/1/fd/2.

Menggunakan pengalihan shell dasar Anda mungkin ingin melakukan sesuatu seperti ini:

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

Dan CMD Anda akan: CMD ["cron", "-f"]

hugoShaka
sumber
14
Bagus: cron -funtuk "cron foreground". Saya telah menyertakan jawaban Anda di bagian saya di atas, untuk visibilitas lebih lanjut +1
VonC
Katakanlah program saya tidak menghasilkan apa-apa. Apakah saya masih dapat menggunakan metode ini dan memastikan proses saya tidak akan berhenti di latar belakang?
Arcsector
1
@Arcsector metode ini menghindari menempatkan proses di latar belakang, itu sebabnya tidak gagal diam-diam. Memiliki proses latar belakang dalam wadah buruh pelabuhan tidak sederhana. Jika Anda ingin memiliki proses latar belakang yang berjalan, Anda mungkin ingin menggunakan proses init untuk memantau beberapa proses yang Anda jalankan dalam wadah. Cara lain adalah memulai proses ke wadah lain di sebelah wadah utama yang disebut 'sespan'. Cara terbaik adalah menghindari banyak proses dalam wadah.
hugoShaka
Bagus dan bersih! Love it :)
AmaelH
1
Ini adalah solusi yang bagus dan bekerja dengan baik untuk kita selain dari satu masalah. Ketika kontainer menerima sinyal SIGTERM, sepertinya tidak menunggu proses yang dijadwalkan untuk selesai dan shutdown yang anggun, malah mematikan proses yang dapat menyebabkan masalah.
James Hulse
107

Bagi mereka yang ingin menggunakan gambar yang sederhana dan ringan:

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"]

Di mana cronjobs adalah file yang berisi cronjobs Anda, dalam formulir ini:

* * * * * echo "hello stackoverflow" >> /test_file 2>&1
# remember to end this file with an empty new line
Oscar Fanelli
sumber
10
Sederhana, ringan dan berbasis gambar standar. Ini harus menjadi jawaban yang diterima. Juga gunakan > /proc/1/fd/1 2> /proc/1/fd/2pengalihan untuk mengakses output cronjobs langsung dari log buruh pelabuhan.
HenriTel
2
Bagi orang yang tidak menggunakan alpine: Crond yang mendukung -d 8parameter bukan cron standar, itu adalah perintah crond dari busybox. Misalnya dari ubuntu, Anda dapat menjalankan ini sebagai busybox crond -f -d 8. Untuk versi yang lebih lama Anda harus menggunakan -L /dev/stdout/.
Trendfischer
2
Saya akan memberikan 100 ini jika saya bisa. Sejauh ini, ini adalah cara terbaik untuk menjalankan pekerjaan cron di lingkungan Docker.
Jitsusama
1
Jika Anda tidak ingin membuat gambar baru setiap kali Anda mengubah pekerjaan cron (atau jika Anda membutuhkan banyak), Anda bisa menjalankan Alpine dan menggunakan volume untuk mengatur cron. Saya diuji dengan menggunakan berikut: docker run -v ${PWD}/cronjobs:/etc/crontabs/root alpine:3.6 crond -f -d 8. @Gostostav Anda dapat menggunakan hal serupa di Docker Compose.
dualitas_
1
CMD ["crond"atau CMD ["cron"?
ahli kode
38

Apa yang disarankan @VonC bagus tapi saya lebih suka melakukan semua konfigurasi tugas cron dalam satu baris. Ini akan menghindari masalah lintas platform seperti lokasi cronjob dan Anda tidak memerlukan file cron yang terpisah.

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

Setelah menjalankan wadah buruh pelabuhan, Anda dapat memastikan apakah layanan cron bekerja dengan:

# 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"

Jika Anda lebih suka memiliki ENTRYPOINT daripada CMD, maka Anda dapat mengganti CMD di atas dengan

ENTRYPOINT cron start && tail -f /var/log/cron.log
Youness
sumber
1
Alternatif yang menarik. +1
VonC
2
RUN apt-get update && apt-get -y install cronatau tidak akan dapat menemukan paketcron
alphabetasoup
2
Terima kasih Youness, Anda memberi saya ide untuk melakukan hal berikut, yang bekerja dalam kasus saya di mana setiap cron ditentukan dalam file yang berbeda: RUN cat $APP_HOME/crons/* | crontab Seperti pesona :)
marcostvz
menambahkan cronke skrip entrypoint sepertinya pilihan terbaik: ENTRYPOINT ["entrypoint.sh"]
bozdoz
20

Ada cara lain untuk melakukannya, yaitu menggunakan Tasker , pelari tugas yang memiliki dukungan cron (penjadwal).

Mengapa Terkadang untuk menjalankan pekerjaan cron, Anda harus mencampur, gambar dasar Anda (python, java, nodejs, ruby) dengan crond. Itu berarti gambar lain untuk dipertahankan. Tasker menghindarinya dengan memisahkan keranjang dan wadah Anda. Anda bisa fokus pada gambar yang ingin Anda jalankan perintah Anda, dan mengkonfigurasi Tasker untuk menggunakannya.

Di sini ada docker-compose.ymlfile, yang akan menjalankan beberapa tugas untuk Anda

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")'

Ada 3 tugas di sana, semuanya akan berjalan setiap menit ( every: minute), dan masing-masing akan menjalankan scriptkode, di dalam gambar yang ditentukan dalamimage bagian.

Jalankan saja docker-compose up, dan lihat itu berfungsi. Inilah repo Tasker dengan dokumentasi lengkap:

http://github.com/opsxcq/tasker

OPSXCQ
sumber
Dockerception (menjalankan wadah buruh pelabuhan dari wadah lain) adalah praktik yang buruk dan harus dibatasi untuk integrasi berkelanjutan. Solusi akan digunakan docker execpada wadah yang ditentukan.
HenriTel
1
Tasker tidak menggunakan buruh pelabuhan di buruh pelabuhan (Dind / Dockerception), perhatikan bahwa melewati soket buruh pelabuhan sebagai pemetaan, semua wadah yang memunculkan berada di dalam dasmon yang dijalankan tasker. Dan jika Anda tidak ingin menjalankan tasker di dalam docker, Anda bisa menggunakannya sebagai aplikasi lain.
OPSXCQ
1
Saya tidak mendapatkan keuntungan menggunakan tasker. Tampaknya benar-benar berlebihan bagi saya menggunakan java dan sh *** hanya untuk menjalankan pekerjaan cron.
Karl Adler
Mencampur cron dan gambar dasar yang Anda butuhkan (python / node misalnya) membuat ketergantungan ekstra yang perlu dipertahankan dan digunakan, dalam skenario ini semua pekerjaan berbagi wadah yang sama, itu berarti bahwa Anda harus khawatir tentang membersihkan semuanya setelah setiap pekerjaan berjalan. Pekerjaan yang dijalankan pada tasker adalah idempoten, sehingga Anda memiliki lebih sedikit hal yang perlu dikhawatirkan.
OPSXCQ
13

Jawaban VonC cukup menyeluruh. Selain itu saya ingin menambahkan satu hal yang membantu saya. Jika Anda hanya ingin menjalankan pekerjaan cron tanpa mengekor file, Anda akan tergoda untuk hanya menghapus && tail -f /var/log/cron.logdari perintah cron.

Namun ini akan menyebabkan wadah Docker keluar segera setelah berjalan karena ketika perintah cron selesai, Docker berpikir perintah terakhir telah keluar dan karenanya membunuh kontainer. Ini bisa dihindari dengan menjalankan cron di foreground via cron -f.

vanugrah
sumber
9

Meskipun ini bertujuan untuk menjalankan pekerjaan di samping proses yang berjalan dalam wadah melalui execantarmuka Docker , ini mungkin menarik bagi Anda.

Saya telah menulis daemon yang mengamati wadah dan menjadwalkan pekerjaan, didefinisikan dalam metadata mereka, pada mereka. Contoh:

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', konfigurasi seperti cron juga dimungkinkan.

Ini dokumennya , inilah repositori gambar .

masa depan yang funky
sumber
Terima kasih. Jawaban ini paling tepat untuk lingkungan wadah Docker. Tidak ada perubahan pada gambar Docker, hanya menambahkan wadah khusus untuk menjalankan tugas, itu berfungsi seperti perintah docker exec <container_name> <some_command>demi jadwal.
PRIHLOP
Ini adalah jawaban "menyelesaikan pekerjaan" paling sederhana dan paling sederhana.
Ibrahim Awad
9

Saya membuat gambar Docker berdasarkan jawaban lain, yang bisa digunakan seperti

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

di mana /path/to/cron: path absolut ke file crontab, atau Anda dapat menggunakannya sebagai basis di Dockerfile:

FROM gaafar/cron

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

# Add your commands here

Untuk referensi, gambar ada di sini .

Gafi
sumber
Gambar yang menarik. +1
VonC
5

Ketika Anda menggunakan wadah Anda di host lain, perlu diketahui bahwa itu tidak akan memulai proses apa pun secara otomatis. Anda perlu memastikan bahwa layanan 'cron' berjalan di dalam wadah Anda. Dalam kasus kami, saya menggunakan Supervisord dengan layanan lain untuk memulai layanan cron.

[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
Sagar Ghuge
sumber
Saya mendapatkan kesalahan di supervisor.log bahwa layanan cron berhenti beberapa kali dan memasuki kondisi FATAL. Namun cron tampaknya berjalan di atas dan menjalankan cronjobs secara normal. Terima kasih untuk ini!
lephleg
Ya, hal yang sama terjadi pada saya juga, tetapi berfungsi seperti biasa, jadi tidak perlu repot.
Sagar Ghuge
5

Tentukan cronjob dalam wadah khusus yang menjalankan perintah melalui buruh pelabuhan ke layanan Anda.

Ini adalah kohesi yang lebih tinggi dan skrip yang berjalan akan memiliki akses ke variabel lingkungan yang telah Anda tetapkan untuk layanan Anda.

#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"
Jakob Eriksson
sumber
Saya tidak bisa mendapatkan ini untuk bekerja menggunakan gerombolan buruh pelabuhan. Mendapat myservice unknownkesalahan.
Mark Grimes
Seharusnya ada peringatan tentang dampak keamanan yang tinggi pada pemasangan dock
casual
4

Jika Anda menggunakan buruh pelabuhan untuk windows, ingatlah bahwa Anda harus mengubah format akhir baris Anda dari CRLF ke LF (yaitu dari dos ke unix) jika Anda bermaksud mengimpor file crontab Anda dari windows ke wadah ubuntu Anda. Jika tidak, cron-job Anda tidak akan berfungsi. Berikut ini contoh kerjanya:

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

Ini benar-benar membuat saya berjam-jam untuk mencari tahu, karena men-debug pekerjaan cron dalam wadah buruh pelabuhan adalah tugas yang membosankan. Semoga ini bisa membantu orang lain di luar sana yang tidak bisa membuat kode mereka berfungsi!

Andreas Forslöw
sumber
3

Dari contoh di atas saya membuat kombinasi ini:

Alpine Image & Edit Menggunakan Crontab di Nano (I hate 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
Dan Watts
sumber
2

Atur cron secara paralel ke pekerjaan satu kali

Buat file skrip, katakan run.sh, dengan pekerjaan yang seharusnya dijalankan secara berkala.

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

Simpan dan keluar.

Gunakan Entrypoint alih-alih CMD

Jika Anda memiliki banyak pekerjaan untuk ditendang selama kontainerisasi buruh pelabuhan, gunakan file entrypoint untuk menjalankan semuanya.

File Entrypoint adalah file skrip yang mulai beraksi ketika perintah run docker dikeluarkan. Jadi, semua langkah yang ingin kita jalankan dapat dimasukkan ke dalam file skrip ini.

Misalnya, kami memiliki 2 pekerjaan yang harus dijalankan:

Jalankan sekali pekerjaan : echo "Docker container telah dimulai"

Jalankan pekerjaan berkala : run.sh

Buat entrypoint.sh

#!/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

Mari kita memahami crontab yang telah diatur dalam file

* * * * *: Jadwal Cron; pekerjaan harus dijalankan setiap menit. Anda dapat memperbarui jadwal berdasarkan kebutuhan Anda.

/run.sh: Jalur ke file skrip yang akan dijalankan secara berkala

/var/log/cron.log: Nama file untuk menyimpan output dari pekerjaan cron yang dijadwalkan.

2>&1: Log kesalahan (jika ada) juga akan diarahkan ke file output yang sama yang digunakan di atas.

Catatan : Jangan lupa untuk menambahkan baris baru, karena menjadikannya cron yang valid. Scheduler.txt: pengaturan cron lengkap akan dialihkan ke file.

Menggunakan variabel lingkungan Sistem / Pengguna khusus dalam cron

Pekerjaan cron saya yang sebenarnya mengharapkan sebagian besar argumen sebagai variabel lingkungan dilewatkan ke perintah run docker. Tetapi, dengan bash, saya tidak dapat menggunakan variabel lingkungan apa pun yang termasuk dalam sistem atau wadah buruh pelabuhan.

Kemudian, ini muncul sebagai solusi untuk masalah ini:

  1. Tambahkan baris berikut di entrypoint.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
  1. Perbarui pengaturan cron dan tentukan-
SHELL=/bin/bash
BASH_ENV=/container.env

Akhirnya, Anda entrypoint.shakan terlihat seperti

#!/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

Terakhir tetapi tidak sedikit: Buat Dockerfile

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

Itu dia. Bangun dan Jalankan gambar Docker!

himanshuIIITian
sumber
1
@himanshuIIITian Saya mencoba ini, masalahnya adalah bahwa skrip "jalankan sekali pekerjaan" tidak pernah kembali dan juga jagung -f tidak kembali jadi ... ini tidak bekerja untuk saya, ada ide? terima kasih
Doron Levi
@DoronLevi - dapatkah Anda membagikan beberapa log untuk melihat masalah ini? Atau Anda dapat memeriksa seluruh kode dari sini - github.com/nehabhardwaj01/docker-cron
himanshuIIITian
Terima kasih untuk umpan baliknya. Saya senang bahwa jawabannya sangat membantu.
himanshuIIITian
1

Pekerjaan Cron disimpan di / var / spool / cron / crontab (Tempat umum di semua distro yang saya tahu). BTW, Anda bisa membuat tab cron di bash menggunakan sesuatu seperti itu:

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

Ini akan membuat file sementara dengan tugas cron, kemudian memprogramnya menggunakan crontab. Baris terakhir hapus file sementara.

Jesus Segnini
sumber
The crondaemon biasanya tidak berjalan dalam sebuah wadah.
Matt
@BhargavNanekalva harus diatur secara khusus dalam sebuah wadah yang tidak dijawab oleh jawaban ini.
Matt
@ Matt, bisa tolong tunjukkan bagaimana tepatnya itu harus ditentukan dalam wadah? . Saya melakukan crontab -l dan perintah ditampilkan - kagda.ru/i/6d014816d43_29-06-2017-11:38:59_6d01.png tetapi masih belum berjalan
Tebe
@ Копать_Шо_я_нашел Anda harus menjalankan crondselain layanan yang Anda jalankan dalam wadah, biasanya dengan manajer layanan seperti s6. Mungkin tanyakan itu sebagai pertanyaan untuk mendapatkan jawaban yang tepat
Matt
1

Ketika menjalankan beberapa gambar terpangkas yang membatasi akses root, saya harus menambahkan pengguna saya ke sudoers dan menjalankannya sebagai 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

Mungkin itu membantu seseorang

Senica Gonzalez
sumber
Saya percaya gambar simpul menggunakan pengguna simpul; jadi mungkin Anda perlu menambahkan izin untuk pengguna itu
bozdoz
1

Jadi, masalah saya sama. Cara mengatasinya adalah mengubah bagian perintah di docker-compose.yml.

Dari

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

Untuk

perintah: crontab / etc / crontab

perintah: tail -f / etc / crontab

The masalah adalah '&&' antara perintah. Setelah menghapus ini, semuanya baik-baik saja.

Di Santi
sumber
-1

Cara paling kuat yang saya temukan sejauh ini adalah menjalankan wadah cron independen - instal klien buruh pelabuhan dan ikat gunung buruh pelabuhan sehingga Anda dapat berbicara dengan server buruh pelabuhan di host.

Kemudian gunakan saja env vars untuk setiap pekerjaan cron dan skrip entrypoint untuk menghasilkan / etc / crontab

Berikut adalah gambar yang saya buat menggunakan prinsip ini dan menggunakannya dalam produksi selama 3-4 tahun terakhir.

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

Krasi Georgiev
sumber
Jawaban harus lengkap dan tidak terkait dengan sumber daya eksternal
Nicolas Bouliane
-2

Coba gunakan permata jarum jam untuk menjadwalkan tugas. Ikuti langkah-langkah yang disediakan dalam tautan ini.

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

Anda dapat memanggil tugas rake di dalam file lib / clock.rb seperti di bawah ini.

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

Buat wadah terpisah di file komposisi buruh pelabuhan & jalankan perintah di bawah ini di dalam wadah.

command: bundle exec clockwork lib/clock.rb
Shobha Deepak
sumber
1
Ide bagus untuk menggunakan beberapa alat lain untuk penjadwalan. Namun, pertanyaan ini meminta cron secara khusus, jadi saran Anda akan lebih baik sebagai komentar untuk pertanyaan menurut pendapat saya.
Richard Kiefer