ডকার পাত্রে কীভাবে ক্রোন জব চালানো যায়?


275

আমি একটি ডক পাত্রে একটি ক্রোনজব চালানোর চেষ্টা করছি যা শেল স্ক্রিপ্টের অনুরোধ করে।

গতকাল আমি সমস্ত ওয়েব এবং সন্ধানের ওভারফ্লোতে অনুসন্ধান করে চলেছি, তবে সত্যিই কাজ করে এমন কোনও সমাধান খুঁজে পেলাম না।
কিভাবে আমি এটি করতে পারব?

সম্পাদনা করুন:

আমি একটি ওয়ার্কিং ডকার ক্রোন কনটেইনার সহ একটি (মন্তব্য করা) গিথুব সংগ্রহশালা তৈরি করেছি যা প্রদত্ত বিরতিতে শেল স্ক্রিপ্টের অনুরোধ করে।

উত্তর:


364

কাজটি চালানোর জন্য বলা চিত্র থেকে প্রবর্তিত কনটেইনারটির জন্য আপনি কোনও চিত্রে আপনার ক্রন্টব অনুলিপি করতে পারেন।

জুলিয়েন বোলে তার " ডকারের সাথে ক্রোন জব চালান " দেখুন :Ekito/docker-cron

hello-cronআমাদের কাজের বর্ণনা দেওয়ার জন্য " " নামে একটি নতুন ফাইল তৈরি করুন ।

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

নীচের ডকফাইল আপনার চিত্রটি তৈরির সমস্ত পদক্ষেপ বর্ণনা করে

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

(দেখুন Gaafar এর মন্তব্য এবং আমি কিভাবে করতে পারি apt-getকম সশব্দ ইনস্টল করবেন? :
apt-get -y install -qq --force-yes cronখুব কাজ করতে পারেন)

দ্বারা হিসাবে উল্লিখিত নাথান লয়েড মধ্যে মন্তব্য :

গোটচা সম্পর্কে দ্রুত নোট:
আপনি যদি কোনও স্ক্রিপ্ট ফাইল যুক্ত করে ক্রোনটি চালানোর জন্য বলছেন তবে ক্রোনকে মনে রাখবেন যদি আপনি ভুলে যান তবে নিঃশব্দে ব্যর্থ হন
RUN chmod 0744 /the_script


অথবা, নিশ্চিত করুন যে আপনার কাজটি নিজেই লগ ফাইলের পরিবর্তে স্টডআউট / স্ট্ডারের দিকে সরাসরি পুনঃনির্দেশ করেছেন, যেমন হুগোশাকার উত্তরে বর্ণিত :

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

শেষ ডকফায়াইল লাইনের সাথে প্রতিস্থাপন করুন

CMD ["cron", "-f"]

আরও দেখুন ( cron -fযা সম্পর্কে ক্রোনকেcron -f " পূর্বভূমি " বলা হয়) " ডকার উবুন্টু কাজ করছে না "


এটি তৈরি করুন এবং চালান:

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

ধৈর্য ধরুন, 2 মিনিটের জন্য অপেক্ষা করুন এবং আপনার কমান্ডলাইনটি প্রদর্শিত হবে:

Hello world
Hello world

এরিক যোগ মন্তব্য :

মনে রাখবেন যে tailচিত্র তৈরির সময় এটি তৈরি করা থাকলে সঠিক ফাইলটি প্রদর্শন করতে পারে না।
যদি এটি হয় তবে আপনার সঠিক ফাইলটি বাছাইয়ের জন্য কনটেইনার রানটাইমের সময় ফাইলটি তৈরি করতে বা স্পর্শ করতে হবে to

" একটি ডকারের শেষে আউটপুট প্রদর্শিত হচ্ছে নাtail -fCMD " দেখুন।


1
আমার প্রথম ক্রোন ইনস্টল করা ছিল, কারণ এটি অন্তর্ভুক্ত নয়। তবে ডকফাইফিলে এটি যুক্ত করে এটি কাজ করে। ধন্যবাদ! RUN apt-get update && apt-get install cron
সি হায়িয়ার

2
-yডকার বিল্ডের উপস্থিতি এড়াতে আপনার সম্ভবত ক্রোন ইনস্টল করা উচিত
gafi

1
@ গাফর রাইট! আমি আরও মন্তব্যযোগ্যতার জন্য উত্তরে আপনার মন্তব্য অন্তর্ভুক্ত করেছি এবং অন্য একটি বিকল্প যুক্ত করেছি।
ভনসি

6
এই সমাধান এখনও কাজ করে? আমি যখন প্রদত্ত গাইডলাইনগুলি অনুসরণ করি, যখন আমি ধারকটিতে রুট এবং টাইপ হিসাবে লগইন crontab -lকরি, আমি রুটের জন্য কোনও ক্রন্টব ইনস্টল করি না , আমার পর্দাও ফাঁকা থাকে। যাইহোক, আমি যখন '/etc/cron.d/' পরীক্ষা করি, আমি দেখতে পাই ক্রোনট্যাব ফিল সেখানে রয়েছে (এবং আরও আশ্চর্যজনকভাবে), যখন আমি যাচাই করি /var/log/cron.log, আমি দেখতে পাই যে স্ক্রিপ্টটি চলছে (ফাইলের সামগ্রীটি সংযুক্ত করা হচ্ছে Hello World)। আমি আমার Dockerfile এই চিত্রটির কাছে করছি: FROM phusion/baseimage:0.10.0। আচরণে তাত্পর্য সম্পর্কে কোনও ধারণা?
হোমুনকুলাস রেটিকুলি

11
2018 হিসাবে, এই পদ্ধতিটি আর কাজ করে না; কেউ কি উবুন্টুর সাথে বেস ইমেজ হিসাবে কাজ করতে তাদের ক্রোনজব পেতে সক্ষম হয়েছে? আল্পাইন চিত্রটিতে আমি আগ্রহী নই যা ক্রোনটি বাক্সের বাইরে চলেছে
পেলিকান

145

গৃহীত সমাধান উত্পাদন পরিবেশে বিপজ্জনক হতে পারে

ডকারে আপনার কেবলমাত্র ধারক প্রতি একটি প্রক্রিয়া চালিত করা উচিত কারণ আপনি যদি তা না করেন তবে যে প্রক্রিয়াটি কাঁটাচামচ করে ফেলেছে এবং তা ব্যাকগ্রাউন্ডে চলেছে তা পর্যবেক্ষণ করা হয় না এবং আপনাকে এটি না জেনে থামতে পারে।

আপনি যখন পটভূমিতে CMD cron && tail -f /var/log/cron.logকার্যকর করার জন্য ক্রোন প্রক্রিয়াটি মূলত কাঁটাচামচ ব্যবহার করেন cron, তখন প্রধান প্রক্রিয়াটি বের হয় এবং আপনাকে tailfঅগ্রভাগে কার্যকর করতে দেয় । পটভূমি ক্রোন প্রক্রিয়াটি থামতে বা ব্যর্থ হতে পারে আপনি লক্ষ্য করবেন না, আপনার ধারকটি এখনও নিঃশব্দে চলবে এবং আপনার অর্কেস্ট্রেশন সরঞ্জামটি এটি পুনরায় আরম্ভ করবে না।

তুমি তোমার Docker মধ্যে সরাসরি ক্রন এর কমান্ড আউটপুট পুনঃনির্দেশিত দ্বারা এই ধরনের একটা জিনিস এড়াতে পারেন stdoutএবং stderrযা যথাক্রমে অবস্থিত হয় /proc/1/fd/1এবং /proc/1/fd/2

প্রাথমিক শেল পুনর্নির্দেশগুলি ব্যবহার করে আপনি এর মতো কিছু করতে চাইতে পারেন:

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

এবং আপনার সিএমডি হবে: CMD ["cron", "-f"]


14
দুর্দান্ত: cron -f"ক্রোন ফোরগ্রাউন্ড" এর জন্য। আরও দৃশ্যমানতার জন্য আমি আপনার উত্তরটিকে আমার উপরের মধ্যে অন্তর্ভুক্ত করেছি। +1
ভনসি

ধরা যাক আমার প্রোগ্রাম কিছুই আউটপুট না। আমি কি এখনও এই পদ্ধতিটি ব্যবহার করতে পারি এবং নিশ্চিত হতে পারি যে আমার প্রক্রিয়া ব্যাকগ্রাউন্ডে থামছে না?
আর্সেক্টর

1
@ আরকসেক্টর এই পদ্ধতিটি পটভূমিতে কোনও প্রক্রিয়া স্থাপন করা এড়াতে পারে, কেন এটি চুপচাপ ব্যর্থ হয় না ts ডকার পাত্রে পটভূমি প্রক্রিয়াটি থাকা সহজ নয়। আপনি যদি একটি চলমান পটভূমি প্রক্রিয়া রাখতে চান তবে আপনি ধারকটিতে চালিত একাধিক প্রক্রিয়াগুলি পর্যবেক্ষণ করতে কোনও init প্রক্রিয়া ব্যবহার করতে পারেন। আর একটি উপায় হ'ল প্রক্রিয়াটি মূলত 'সিডিকার' নামে একটি অন্য ধারকতে শুরু করা। পাত্রে একাধিক প্রক্রিয়া এড়ানোর জন্য সবচেয়ে ভাল উপায়।
হুগোশাকা

সুন্দর এবং পরিষ্কার! এটি
ভালবাসুন

1
এটি একটি ভাল সমাধান এবং একটি ইস্যু বাদ দিয়ে আমাদের পক্ষে ভাল কাজ করে। কনটেইনার যখন একটি সিগনিটার সিগন্যাল পেয়ে থাকে তখন মনে হয় না যে নির্ধারিত প্রক্রিয়াটি শেষ হয়ে যাওয়ার এবং গ্রেপ্তার হয়ে শাটডাউন করার অপেক্ষা করা হবে, পরিবর্তে এটি প্রক্রিয়াটিকে হত্যা করছে যা সমস্যার কারণ হতে পারে।
জেমস হুলসে

106

যারা একটি সহজ এবং হালকা ওজনের চিত্র ব্যবহার করতে চান তাদের জন্য:

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

ক্রোনজবস হ'ল এমন ফর্ম যেখানে আপনার ক্রোনজবস রয়েছে এই ফর্মটিতে:

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

10
সহজ, হালকা এবং মানক চিত্র ভিত্তিক। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। > /proc/1/fd/1 2> /proc/1/fd/2সরাসরি ডকার লগ থেকে ক্রোনজবস আউটপুট অ্যাক্সেস করতে পুনঃনির্দেশটিও ব্যবহার করুন ।
হেনরিটেল

2
লোকেরা আলপাইন ব্যবহার করে না: -d 8প্যারামিটারকে সমর্থন করা ক্রন্ড মানক ক্রোন নয়, এটি ব্যস্তবক্স থেকে ক্রন্ড কমান্ড। উবুন্টু থেকে উদাহরণস্বরূপ, আপনি এটি হিসাবে চালাতে পারেন busybox crond -f -d 8। পুরানো সংস্করণগুলির জন্য আপনাকে ব্যবহার করতে হবে -L /dev/stdout/
ট্রেন্ডফিশার

আমার প্রয়োজনের জন্য - স্বতন্ত্রভাবে ক্রোন চাকরির একটি উত্পাদন সেটিং সেট অনুকরণ করে যেখানে আমার কী ঘটছে তা দেখার দরকার। এটি দুর্দান্ত।
থরবজর্ন রাভন অ্যান্ডারসন

2
আমি যদি এই +100 দিতে পারতাম। ডকার পরিবেশে ক্রোন জব চালানোর এটি এখন পর্যন্ত সেরা উপায়।
জিতসামামা

1
আপনি যখন ক্রোন জব পরিবর্তন করেন (বা আপনার যদি একাধিক প্রয়োজন হয়) প্রতিবার নতুন চিত্র তৈরি করতে না চান, আপনি কেবল আলপাইন চালাতে পারেন এবং ক্রোন সেট করতে একটি ভলিউম ব্যবহার করতে পারেন। আমি এটা ব্যবহার করছেন পরীক্ষিত: docker run -v ${PWD}/cronjobs:/etc/crontabs/root alpine:3.6 crond -f -d 8। @ গ্রোস্টাভ আপনি ডকার রচনাতে একই জাতীয় জিনিস ব্যবহার করতে পারেন।
দ্বৈত_

38

@ ভনসি যা পরামর্শ দিয়েছে তা দুর্দান্ত তবে আমি সমস্ত লাইনে সমস্ত ক্রোন জব কনফিগারেশন এক লাইনে করা পছন্দ করি। এটি ক্রোনজব অবস্থানের মতো ক্রস প্ল্যাটফর্মের সমস্যাগুলি এড়াতে পারে এবং আপনার আলাদা ক্রোন ফাইলের দরকার নেই।

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

আপনার ডকার ধারক চালানোর পরে, আপনি ক্রোন পরিষেবাটি কাজ করছে কিনা তা নিশ্চিত করতে পারেন:

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

আপনি যদি সিএমডির পরিবর্তে ENTRYPOINT রাখতে পছন্দ করেন তবে আপনি উপরে সিএমডিটি বিকল্পের সাথে রাখতে পারেন

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

1
আকর্ষণীয় বিকল্প। +1
ভোনসি

2
RUN apt-get update && apt-get -y install cronঅন্যথায় এটি প্যাকেজটি সন্ধান করতে সক্ষম হবে নাcron
বর্ণমালাটিউপ

2
ধন্যবাদ ইউনেস, আপনি আমাকে নিম্নলিখিতগুলি করার ধারণা দিয়েছেন, যা আমার ক্ষেত্রে কাজ করেছিল যেখানে প্রতিটি RUN cat $APP_HOME/crons/* | crontab
ক্রোনকে

cronএন্ট্রিপয়েন্ট স্ক্রিপ্টে যুক্ত করা সর্বোত্তম বিকল্প বলে মনে হচ্ছে: ENTRYPOINT ["enterPoint.sh"]
বোজডোজ

20

এটি করার আরও একটি উপায় রয়েছে, টাসকার ব্যবহার করা , এমন একটি টাস্ক রানার যার ক্রোন (শিডিয়ুলার) সমর্থন রয়েছে।

কেন? কখনও কখনও ক্রোন জব চালানোর জন্য, আপনার মিশ্রণ করতে হবে, আপনার বেস ইমেজ (পাইথন, জাভা, নোডেজ, রুবি) ক্রন্ডের সাথে। এর অর্থ অন্য একটি চিত্র বজায় রাখা। টাস্কর ক্রন্ড এবং আপনার ধারকটিকে ডিকুয়াল করে এড়িয়ে চলুন। আপনি কেবল যে চিত্রটি আপনার কমান্ডগুলি কার্যকর করতে চান তার উপর ফোকাস করতে পারেন এবং এটি ব্যবহারের জন্য টাস্করকে কনফিগার করতে পারেন।

এখানে একটি docker-compose.ymlফাইল, এটি আপনার জন্য কিছু কাজ চালাবে

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

সেখানে 3 টি কার্য রয়েছে, সেগুলির প্রত্যেকটি প্রতি মিনিটে চলবে ( every: minute) এবং তাদের প্রত্যেকটি বিভাগে scriptসংজ্ঞায়িত চিত্রটির অভ্যন্তরে কোডটি কার্যকর করবে image

শুধু চালান docker-compose up, এবং এটি কাজ দেখতে। পুরো ডকুমেন্টেশন সহ এখানে টাস্কোর রেপো রয়েছে:

http://github.com/opsxcq/tasker


ডকারসেপশন (অন্য ধারক থেকে ডকার পাত্রে চালানো) একটি খারাপ অভ্যাস এবং ক্রমাগত একীকরণের মধ্যে সীমাবদ্ধ হওয়া উচিত। docker execনির্দিষ্ট পাত্রে ব্যবহারের জন্য একটি কার্যকারিতা হবে ।
হেনরিটেল

1
টাস্কার ডকারে ডকার ব্যবহার করেন না (ডাইন্ড / ডকারসেপশন), নোট করুন যে মকিং হিসাবে ডকার সকেটটি পাস হয়েছে, সমস্ত কন্টেইনারগুলি ডিমনটিতে তৈরি হয়েছে যা টাসারটি চালিত করে। এবং যদি আপনি ডকারের ভিতরে টাস্কার চালাতে না চান তবে আপনি কেবল এটি অন্য কোনও অ্যাপ্লিকেশন হিসাবে স্থাপন করতে পারেন।
OPSXCQ

1
টাস্কার ব্যবহারের সুবিধা আমি পাই না। জাভা এবং শ *** কেবল ক্রোন কাজ চালানোর জন্য ব্যবহার করে আমার কাছে সত্যিই ওভারকিল বলে মনে হচ্ছে।
কার্ল অ্যাডলার

আপনার প্রয়োজন ক্রোন এবং বেস ইমেজ মিশ্রন (উদাহরণস্বরূপ অজগর / নোড) একটি অতিরিক্ত নির্ভরতা তৈরি করুন যা বজায় রাখা এবং মোতায়েন করা দরকার, এই পরিস্থিতিতে সমস্ত কাজ একই পাত্রে ভাগ করে দেয়, এর অর্থ হল যে আপনাকে সমস্ত কিছু পরিষ্কার করার পরে চিন্তা করতে হবে প্রতিটি কাজ চালায়। টাস্কারে চালিত চাকরিগুলি আদর্শবান, তাই আপনার উদ্বেগ করার মতো কম জিনিস রয়েছে।
ওপিএসএক্সসিকিউ

13

ভনসির উত্তরটি বেশ পুরোপুরি। এছাড়াও আমি একটি জিনিস যুক্ত করতে চাই যা আমাকে সাহায্য করেছিল। আপনি যদি কোনও ফাইল টেলিং না করে কেবল ক্রোন জব চালাতে চান তবে আপনাকে && tail -f /var/log/cron.logক্রোন কমান্ড থেকে সরিয়ে ফেলতে প্রলুব্ধ করবেন ।

যাইহোক এটি ডকারের ধারকটি দৌড়ানোর অল্প সময়ের মধ্যেই প্রস্থান করবে কারণ ক্রোন কমান্ডটি শেষ হলে ডকার মনে করেন যে শেষ কমান্ডটি প্রস্থান করেছে এবং তাই ধারকটি মেরে ফেলে। এর মাধ্যমে অগ্রভাগে ক্রোন চালিয়ে এড়ানো যেতে পারে cron -f


9

যদিও এটির উদ্দেশ্য ডকারের execইন্টারফেসের মাধ্যমে একটি ধারকটিতে চলমান প্রক্রিয়াটির পাশে কাজ চালানো , এটি আপনার পক্ষে আগ্রহী হতে পারে।

আমি একটি ডেমন লিখেছি যা তাদের মেটাডেটাতে সংজ্ঞায়িত কনটেইনার এবং সময়সূচী কাজগুলি পর্যবেক্ষণ করে। উদাহরণ:

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

'ক্লাসিক', ক্রোন-জাতীয় কনফিগারেশনও সম্ভব।

এখানে ডক্স রয়েছে , এখানে চিত্রের সংগ্রহস্থল


ধন্যবাদ. এই উত্তরটি ডকার পাত্রে পরিবেশের জন্য সবচেয়ে সঠিক। ডকার চিত্রগুলিতে কোনও পরিবর্তন হয়নি, শুধুমাত্র কার্য সম্পাদনের জন্য বিশেষ ধারক যুক্ত করা, এটি docker exec <container_name> <some_command>সময়সূচী অনুসারে কমান্ডের মতো কাজ করে।
PRIHLOP

এটি সবচেয়ে সহজতম "কাজটি শেষ করুন" উত্তর।
ইব্রাহিম আওয়াদ

9

আমি অন্যান্য উত্তরগুলির উপর ভিত্তি করে একটি ডকার চিত্র তৈরি করেছি, যা এর মতো ব্যবহার করা যেতে পারে

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

যেখানে /path/to/cron: ক্রন্টব ফাইলের নিখুঁত পথ, বা আপনি এটি ডকফাইফিলের বেস হিসাবে ব্যবহার করতে পারেন:

FROM gaafar/cron

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

# Add your commands here

রেফারেন্সের জন্য, চিত্রটি এখানে রয়েছে


আকর্ষণীয় চিত্র। +1
ভোনসি

5

আপনি যখন অন্য কোনও হোস্টে আপনার ধারক স্থাপন করবেন, কেবলমাত্র নোট করুন যে এটি কোনও প্রক্রিয়া স্বয়ংক্রিয়ভাবে শুরু হবে না। আপনার কনটেইনারটির ভিতরে 'ক্রোন' পরিষেবা চালু রয়েছে তা নিশ্চিত করা দরকার। আমাদের ক্ষেত্রে, আমি ক্রোন পরিষেবা শুরু করতে অন্যান্য পরিষেবাদিগুলির সাথে সুপারভাইজার্ড ব্যবহার করছি।

[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

আমি সুপারভাইজার.লগে একটি ত্রুটি পেয়েছি যে ক্রোন পরিষেবাটি একাধিকবার বন্ধ হয়ে গেছে এবং একটি FATAL অবস্থায় প্রবেশ করেছে। তবে ক্রোন মনে হয় শীর্ষে চলছে এবং ক্রোনজবসগুলি সাধারণত চালায়। এর জন্য ধন্যবাদ!
লেফলেগ

হ্যাঁ, আমার সাথেও একই ঘটনা ঘটেছিল তবে এটি স্বাভাবিক হিসাবে কাজ করে, তাই বিরক্ত করার দরকার নেই।
সাগর ঘুগে

5

কোনও ডেডিকেটেড ধারকটিতে ক্রোনজব সংজ্ঞায়িত করুন যা আপনার পরিষেবাতে ডকার এক্সিকিউটের মাধ্যমে কমান্ডটি চালায়।

এটি উচ্চতর সংহতি এবং চলমান স্ক্রিপ্টটিতে আপনি আপনার পরিষেবার জন্য সংজ্ঞায়িত পরিবেশ পরিবর্তনশীলগুলিতে অ্যাক্সেস পাবেন।

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

আমি এটি ডকার সোকার ব্যবহার করে কাজ করতে পারিনি। পথ myservice unknownত্রুটি।
মার্ক গ্রিমস

সেখানে উচ্চ নিরাপত্তা প্রভাব একটি Docker সকেট মাউন্ট সম্পর্কে একটি সতর্কবার্তা হওয়া উচিত রয়েছে: lvh.io/posts/...
নৈমিত্তিক

4

আপনি যদি উইন্ডোজের জন্য ডকার ব্যবহার করছেন, মনে রাখবেন যে আপনি উইন্ডো থেকে আপনার উন্টু ধারকটিতে আপনার ক্রন্টব ফাইলটি আমদানি করতে চাইলে আপনার লাইন-এন্ডিং ফর্ম্যাটটি সিআরএলএফ থেকে এলএফতে (যেমন ডস থেকে ইউনিক্সে) করতে হবে। যদি তা না হয় তবে আপনার ক্রোন-জব কাজ করবে না। এখানে একটি কার্যকারী উদাহরণ:

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

প্রকৃতপক্ষে এটি জানতে আমার কয়েক ঘন্টা সময় লেগেছে, কারণ ডকার পাত্রে ক্রোন জবগুলি ডিবাগ করা একটি ক্লান্তিকর কাজ। আশা করি এটি সেখানকার অন্য কাউকে সহায়তা করে যা তাদের কোডটি কাজ করতে না পারে!


3

উপরের উদাহরণগুলি থেকে আমি এই সংমিশ্রণটি তৈরি করেছি:

আল্পাইন চিত্র এবং ন্যানোতে ক্রন্টাব ব্যবহার করে সম্পাদনা করুন (আমি 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

এককালীন কাজের সমান্তরালে ক্রোন সেটআপ করুন

স্ক্রিপ্ট ফাইল তৈরি করুন, run.sh বলুন, যে কাজটি পর্যায়ক্রমে চালানোর কথা।

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

সংরক্ষণ এবং ত্যাগ.

সিএমডির পরিবর্তে এন্ট্রিপয়েন্ট ব্যবহার করুন

চ ডকার কনটেইনারাইজেশনের সময় আপনার একাধিক কাজ রয়েছে, এগুলি চালানোর জন্য এন্ট্রিপয়েন্ট ফাইলটি ব্যবহার করুন।

এন্ট্রিপয়েন্ট ফাইল হ'ল একটি স্ক্রিপ্ট ফাইল যা ডকার রান কমান্ড জারি করা হলে কার্যকর হয়। সুতরাং, আমরা যে সমস্ত পদক্ষেপগুলি চালাতে চাই তা এই স্ক্রিপ্ট ফাইলে রাখা যেতে পারে।

উদাহরণস্বরূপ, আমাদের চালানোর জন্য 2 টি কাজ রয়েছে:

একবার কাজ চালান : প্রতিধ্বনি "ডকারের ধারক শুরু হয়েছে"

পর্যায়ক্রমিক কাজ চালান : run.sh

এন্ট্রিপয়েন্টপয়েন্ট তৈরি করুন 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

আসুন ফাইলটিতে সেট করা ক্রন্টবটি বুঝতে পারি

* * * * *: ক্রোন শিডিউল; কাজটি প্রতি মিনিটে চালাতে হবে। আপনি আপনার প্রয়োজনের ভিত্তিতে সময়সূচি আপডেট করতে পারেন।

/run.sh: স্ক্রিপ্ট ফাইলের পথ যা সময় সময় চালানো হয়

/var/log/cron.log: নির্ধারিত ক্রোন কাজের আউটপুট সংরক্ষণ করার জন্য ফাইলের নাম।

2>&1: ত্রুটি লগগুলি (যদি থাকে তবে) উপরে ব্যবহৃত একই আউটপুট ফাইলেও পুনঃনির্দেশিত হবে।

দ্রষ্টব্য : অতিরিক্ত একটি নতুন লাইন যুক্ত করতে ভুলবেন না, কারণ এটি এটিকে বৈধ ক্রোন করে। Scheduler.txt: সম্পূর্ণ ক্রোন সেটআপ কোনও ফাইলে পুনর্নির্দেশ করা হবে।

ক্রোন মধ্যে সিস্টেম / ব্যবহারকারী নির্দিষ্ট পরিবেশের ভেরিয়েবল ব্যবহার করে

পরিবেশের ভেরিয়েবলগুলি ডকার রান কমান্ডের কাছে পাঠানো হওয়ায় আমার আসল ক্রোন জব বেশিরভাগ যুক্তি প্রত্যাশা করেছিল। তবে, বাশ সহ, আমি সিস্টেম বা ডকারের ধারক অন্তর্ভুক্ত কোনও পরিবেশের ভেরিয়েবল ব্যবহার করতে পারিনি।

তারপরে, এটি এই সমস্যার ওয়ালকারাউন্ড হিসাবে উঠে এসেছে:

  1. এন্ট্রিপয়েন্ট.শিতে নিম্নলিখিত লাইনটি যুক্ত করুন
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
  1. ক্রোন সেটআপ আপডেট করুন এবং নির্দিষ্ট করুন-
SHELL=/bin/bash
BASH_ENV=/container.env

শেষ অবধি, আপনার entrypoint.shমত দেখতে হবে

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

সর্বশেষে তবে সর্বনিম্ন নয়: একটি ডকফেরফিল তৈরি করুন

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

এটাই. ডকার চিত্রটি তৈরি করুন এবং রান করুন!


1
@ হিমানশুআইআইআইটিআইআই আমি এটি চেষ্টা করেছিলাম, বিষয়টি হ'ল স্ক্রিপ্ট "একবার রান করাই চাকরি" কখনই ফিরে আসে না এবং কর্ন-এফও ফিরছে না ... এটি আমার পক্ষে কাজ করছে না, কোন ধারণা? ধন্যবাদ
ডোরন লেভি

@ ডোরনলেভি - আপনি কি দয়া করে সমস্যাটি দেখার জন্য কিছু লগ ভাগ করতে পারেন? - অথবা আপনি এখান থেকে পুরো কোড পরীক্ষা করতে পারবেন github.com/nehabhardwaj01/docker-cron
himanshuIIITian

সাহায্য করার জন্য ধন্যবাদ. উত্তরটি সহায়ক হয়েছিল বলে আমি আনন্দিত।
হিমাংশুআইআইটিআইয়ান

1

ক্রোন জবগুলি / var / spool / cron / crontabs এ সংরক্ষণ করা হয় (আমার জানা সমস্ত ডিস্ট্রোজে সাধারণ জায়গা)। বিটিডাব্লু, আপনি এরকম কিছু ব্যবহার করে ব্যাশে ক্রোন ট্যাব তৈরি করতে পারেন:

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

এটি ক্রোন টাস্ক সহ একটি অস্থায়ী ফাইল তৈরি করবে, তারপরে ক্রন্টাব ব্যবহার করে এটি প্রোগ্রাম করবে। শেষ লাইন অস্থায়ী ফাইল সরান।


cronডেমন সাধারণত একটি কন্টেইনারে চলে না।
ম্যাট

@ ভরগাভনেেকালভাতে এটি নির্দিষ্টভাবে একটি ধারক মধ্যে সেটআপ করা দরকার যা এই উত্তরটির সমাধান করে না।
ম্যাট

@ ম্যাট, আপনি দয়া করে এটি ধারক মধ্যে নির্দিষ্ট করা উচিত কিভাবে নির্দেশ করতে পারেন? । আমি ক্রন্টব- এল করি এবং আদেশটি প্রদর্শিত হবে - kagda.ru/i/6d014816d43_29-06-2017-11:38:59_6d01.png তবে এখনও চালানো হচ্ছে না
তেবে

@ Копать_Шо_я_нашел আপনি ধারকটিতে crondযে পরিষেবাটি চালাচ্ছেন সেগুলি ছাড়াও আপনাকে সাধারণত চালনা করতে হবে, সাধারণত সার্ভিস ম্যানেজারের সাথে এস 6 এর মতো। সম্ভবত একটি যথাযথ উত্তর পেতে প্রশ্ন হিসাবে জিজ্ঞাসা করুন
ম্যাট

1

কিছু ছাঁটা ডাউন চিত্রগুলিতে চলার সময় যা রুট অ্যাক্সেসকে বাধা দেয়, আমাকে আমার ব্যবহারকারীকে sudoers এ যুক্ত করতে হয়েছিল এবং এটি হিসাবে চালাতে হয়েছিল 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

হতে পারে যে কাউকে সাহায্য করে


আমি বিশ্বাস করি নোড চিত্রটি নোড ব্যবহারকারীকে ব্যবহার করে; সুতরাং সম্ভবত আপনাকে সেই ব্যবহারকারীর জন্য অনুমতিগুলি যুক্ত করতে হবে
বোজডোজ

1

সুতরাং, আমার সমস্যাটি একই ছিল। ফিক্সটি ছিল কমান্ড বিভাগে পরিবর্তন করা docker-compose.yml

থেকে

কমান্ড: crontab / ইত্যাদি / crontab && লেজ -f / ইত্যাদি / crontab

প্রতি

কমান্ড: crontab / etc / crontab

কমান্ড: লেজ -f / ইত্যাদি / crontab

সমস্যা কমান্ড মধ্যে ছিল '&&'। এটি মুছে ফেলার পরে, এটি সব ঠিক ছিল।


-1

আমি এখনও অবধি সবচেয়ে শক্তিশালী উপায়ে স্বতন্ত্র ক্রোন কনটেইনারটি চালাচ্ছি - ডকার ক্লায়েন্ট ইনস্টল করুন এবং ডকার সকে মাউন্ট করুন যাতে আপনি হোস্টের ডকার সার্ভারের সাথে কথা বলতে পারেন।

তারপরে প্রতিটি ক্রোন কাজের জন্য এনভ ভার্স এবং / ইত্যাদি / ক্রন্টব তৈরি করার জন্য একটি এন্ট্রিপয়েন্ট স্ক্রিপ্ট ব্যবহার করুন

এখানে এই চিত্রটি তৈরি করা হয়েছে যা আমি এই নীতিটি ব্যবহার করে এবং এটি উত্পাদন করতে গত 3-4 বছর ধরে ব্যবহার করে।

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


উত্তরগুলি স্বয়ংসম্পূর্ণ হওয়া উচিত এবং বাহ্যিক সংস্থার সাথে
লিঙ্কযুক্ত নয়

-2

কাজের সময়সূচী করতে ক্লকওয়ার্ক রত্ন ব্যবহার করার চেষ্টা করুন। এই লিঙ্কে প্রদত্ত পদক্ষেপগুলি অনুসরণ করুন।

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

আপনি নীচে হিসাবে lib / ঘন্টা.rb ফাইল ভিতরে রেক টাস্ক কল করতে পারেন।

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

ডকার-রচনা ফাইলটিতে একটি পৃথক ধারক তৈরি করুন এবং ধারকটির ভিতরে নীচের কমান্ডটি চালান।

command: bundle exec clockwork lib/clock.rb

1
সময় নির্ধারণের জন্য অন্য কিছু সরঞ্জাম ব্যবহার করার জন্য দুর্দান্ত ধারণা। যাইহোক, এই প্রশ্নটি ক্রোনটির জন্য বিশেষভাবে জিজ্ঞাসা করেছে, সুতরাং আপনার মতামতটি আমার মতে প্রশ্নটির মন্তব্য হিসাবে ভাল হবে।
রিচার্ড কেফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.