docker - जड़ के लिए कोई crontab नहीं


10

मेरा डॉकफाइल सही ढंग से निर्माण करता प्रतीत होता है (यह मुझे ऐसा बताता है)। जब मैं कंटेनर चलाता हूं, तो मुझे नीचे त्रुटि संदेश मिलता है। मैंने CMDसेवा की निर्देशिका के साथ और बिना कमांड चलाने की कोशिश की है ।

crontab.shमूल रूप से एक पाठ फ़ाइल ( cron.jobs) के लिए एक क्रोन अनुसूची लिखता है और फिर पाठ फ़ाइल को कोंट्राब में आयात करता है।

Dockerfile:

FROM node:0.10
MAINTAINER Tom

VOLUME /var/log/

RUN mkdir /pulse
ADD . /pulse
WORKDIR /pulse

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

ADD *.sh /pulse/
RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/

RUN chmod 644 /etc/crontab

CMD cron -f
CMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.log
CMD cron /pulse/cron.jobs
CMD crontab -l

edited to add crontab.sh

crontab.sh (कुछ क्रोन हटा दिए गए हैं):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1

EOF

crontab cron.jobs

त्रुटि:

no crontab for root

साइड नोट्स:

  • पल्स सेवा का नाम है।
  • सेवा के कारण नोड का संस्करण पुराना है, इसे अपग्रेड किया जाएगा।
  • सेवा अनिवार्य रूप से नोड में क्रोन नौकरियों के लिए है

Serverfault.com/a/851500/395574 और serverfault.com/a/851479/395574 के संयोजन ने इसे हल करने में मदद की।
टॉमफिरथ

जवाबों:


11

यह dockerfile (फ़ाइल में आदेशों के बजाय) के साथ एक समस्या है। केवल एक CMDचलाया जाता है (अंतिम एक) - https://docs.docker.com/engine/reference/builder/#cmd देखें

Dockerfile में केवल एक CMD निर्देश हो सकता है। यदि आप एक से अधिक सीएमडी को सूचीबद्ध करते हैं तो केवल अंतिम सीएमडी ही प्रभावी होगा।


आह, और वहाँ है कि सब कुछ के ऊपर :) :) ओपी: यह मेरे स्पष्टीकरण को अमान्य नहीं करता है और आपको अनिवार्य रूप से आपके CMDसाथ बदलना होगा RUN
स्वेन

2
मुझे लगता है कि इसे मुद्दा बनाना थोड़ा बंद है। यह बर्ताव डिज़ाइन के चलते है। कंटेनर मिनी-ओएस नहीं हैं। वे अनुप्रयोग-केंद्रित हैं।
जिमीजैम

माना। मेरा इरादा स्पष्ट करना था कि ओपी की समस्या क्रोन के किसी भी विवरण के बजाय उनके docker config में है।
पॉल हैडेन

यह एक डोकर नहीं है मुद्दा । यह डिजाइन द्वारा है।
एंड्रयू सविनाख

5

जैसा कि अन्य उत्तर पहले ही समझा चुके हैं, केवल एक ही CMDप्रति डॉकरफाइल चलाया जाएगा और आप जो कमांड चलाना चाहते हैं वह गलत है।

लेकिन आपके सेटअप IMO के साथ एक और अधिक दबाने वाला मुद्दा है - डॉकर कंटेनर आमतौर पर इस तरह से काम करने के लिए डिज़ाइन नहीं किए जाते हैं। क्या आप के बजाय क्या करना चाहिए (एक बंद प्रक्रियाओं के रूप में मेजबान (या अपने वाद्यवृन्दकार) से क्रॉन चल रही सेवाओं को शायद कुछ इस तरह उपयोग कर रहा है docker runया docker-compose run, या, यदि किसी कारण से आप इस के लिए एक अलग कंटेनर शुरू करने के लिए नहीं करना चाहते, मैं आप उपयोग कर सकते हैं लगता है docker exec)।

यह सिर्फ मेरा दृष्टिकोण है कि कंटेनरों का उपयोग कैसे किया जाना चाहिए, इसलिए जाहिर है कि आपको इसे नमक के दाने के साथ लेना चाहिए।


2
मेरे पास क्रोन के साथ केवल एक परिचित परिचित है लेकिन मुझे लगता है कि इसे समझदार बनाने के लिए, सीएमडी को क्रोनड चलाने की आवश्यकता होगी। अन्यथा, कंटेनर कमांडो कमांड खत्म होने के बाद बाहर निकल जाएगा।
जिमीजैम

@JimmyJames जो आप कह रहे हैं वह सही है, लेकिन जैसा कि मैंने ऊपर बताया है, बेहतर उपाय यह है कि इन कमांडों को एक बाहर के क्रोन से वन-ऑफ docker runs के रूप में चलाया जाए । अधिक कंटेनर-वाई। :)
Artur Ciesielski

आप सही हो सकते हैं। सवाल दिलचस्प है क्योंकि यह स्पष्ट नहीं है कि क्या यह आपके कंटेनर की कमान के रूप में क्रोन को चलाने के लिए समझ में आता है। यह काम करने योग्य हो सकता है लेकिन यह एक कंटेनर में अजीब लगता है।
जिमीजैम

3

यदि आप इसे जोड़ते हैं /etc/crontab, तो यह रूट के व्यक्तिगत crontab में दिखाई नहीं देगा, क्योंकि इसमें केवल उपयोगकर्ता-विशिष्ट crontab के साथ संपादित किया गया है crontab -e, न कि सिस्टम-वाइड एक में /etc


अधिक जानकारी:

मेरा अनुमान है कि /pulse/crontab.sh(जो आप नहीं दिखाते हैं, क्यों?) संबंधित crontab लाइन को सिस्टम वाइड crontab फ़ाइल में जोड़ता है /etc/crontab। आप बाद में आदेश पर अमल crontab -l, लेकिन क्योंकि यह सूचियों यह केवल एक त्रुटि से पता चलता rootरों व्यक्तिगत crontab केवल (जो रिक्त होता है), में पूरे सिस्टम में एक नहीं /etc/crontab। यह सब पूरी तरह से सामान्य और अपेक्षित है। अपनी स्क्रिप्ट को जोड़ने वाली लाइन दिखाने के लिए, आप के CMD crontab -lसाथ प्रतिस्थापित करेंगे CMD cat /etc/crontab

इस सबका किसी भी dockerfile कमांड से कोई लेना-देना नहीं है ADD, RUNया CMD, यह सिर्फ मूल लिनक्स सामान है।


मुझे लगता है कि मैं यह समझता हूं। मेरी बिल्ड सेटिंग्स उपयोगकर्ता पर हैं, लेकिन मेरी रन सेटिंग्स रूट के क्रैस्टैब से चलने का प्रयास कर रही हैं? यह समझ में आता है, मैं उस के आसपास काम करने की कोशिश करूँगा। मुझे लग रहा है कि आपका मतलब यह नहीं था: ADD . /etc/crontabजैसा कि काम नहीं करता है।
टॉमफिरथ

@TomFirth: इसका कोई मतलब नहीं है। कृपया आगे के विवरण के लिए मेरा संपादन पढ़ें।
स्वेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.