นักเทียบท่า - ไม่มี crontab สำหรับรูต


10

My Dockerfile ดูเหมือนจะสร้างอย่างถูกต้อง (มันบอกฉันอย่างนั้น) เมื่อฉันเรียกใช้คอนเทนเนอร์ฉันได้รับข้อความแสดงข้อผิดพลาดด้านล่าง ฉันได้ลองใช้คำสั่ง ( CMD) โดยมีและไม่มีไดเรกทอรีของบริการ

crontab.shโดยทั่วไปจะเขียนกำหนดการ cron ไปยังไฟล์ข้อความ ( cron.jobs) แล้วนำเข้าไฟล์ข้อความไปยัง crontab

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 (crons บางส่วนถูกลบแล้ว):

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

หมายเหตุด้านข้าง:

  • Pulse เป็นชื่อของบริการ
  • รุ่นของโหนดเก่าเนื่องจากการให้บริการนี้จะได้รับการอัพเกรด
  • บริการเป็นสิ่งสำคัญสำหรับงาน cron ในโหนด

การรวมกันของserverfault.com/a/851500/395574และserverfault.com/a/851479/395574ช่วยแก้ไขปัญหานี้ได้
TomFirth

คำตอบ:


11

มันเป็นปัญหาของ dockerfile (แทนที่จะเป็นคำสั่งในไฟล์) CMDมีการเรียกใช้เพียงรายการเดียว(รายการสุดท้าย) - ดูhttps://docs.docker.com/engine/reference/builder/#cmd

สามารถมีคำสั่ง CMD ได้เพียงคำสั่งเดียวใน Dockerfile หากคุณแสดงรายการมากกว่าหนึ่ง CMD เฉพาะ CMD สุดท้ายเท่านั้นที่จะมีผล


Ah และมีที่ด้านบนของทุกอย่างอื่น :) การ OP: นี้ไม่ได้ทำให้คำอธิบายของฉันและคุณเป็นหลักจะต้องเปลี่ยนของคุณด้วยCMD RUN
สเวน

2
ฉันคิดว่าการเรียกสิ่งนี้เป็นปัญหาเล็กน้อย พฤติกรรมนี้เกิดจากการออกแบบ ภาชนะบรรจุไม่ใช่ mini-OS แอปพลิเคชันเป็นศูนย์กลาง
JimmyJames

ตกลง ความตั้งใจของฉันคือการชี้แจงว่าปัญหาของ OP อยู่ในการตั้งค่านักเทียบท่ามากกว่ารายละเอียดของ cron
Paul Haldane

นี้ไม่ได้เป็นนักเทียบท่าปัญหา มันเป็นโดยการออกแบบ
Andrew Savinykh

5

ตามที่คำตอบอื่น ๆ ได้อธิบายไปแล้วจะมีเพียงหนึ่งCMDคำสั่งต่อ Dockerfile และคำสั่งที่คุณต้องการเรียกใช้นั้นไม่ถูกต้อง

แต่มีปัญหาเร่งด่วนยิ่งขึ้นกับการตั้งค่า IMO ของคุณ - โดยปกติแล้วคอนเทนเนอร์นักเทียบท่าไม่ได้ออกแบบมาเพื่อทำงานในลักษณะนี้ สิ่งที่คุณควรทำคือเรียกใช้บริการ cron จากโฮสต์ (หรือผู้ดูแลระบบของคุณ) เป็นกระบวนการแบบครั้งเดียว (อาจใช้บางอย่างเช่นdocker runหรือdocker-compose runหรือถ้าด้วยเหตุผลบางอย่างที่คุณไม่ต้องการเริ่มต้นคอนเทนเนอร์แยกต่างหากสำหรับฉัน เดาว่าคุณสามารถใช้docker exec)

นี่เป็นเพียงมุมมองของฉันเกี่ยวกับวิธีการใช้ภาชนะแม้ว่าอย่างชัดเจนดังนั้นคุณควรใช้มันด้วยเม็ดเกลือ


2
ฉันมีความคุ้นเคยที่ผ่านมากับ cron เท่านั้น แต่ฉันคิดว่าเพื่อที่จะทำให้สิ่งนี้มีเหตุผล CMD จะต้องใช้ crond มิฉะนั้นคอนเทนเนอร์จะออกหลังจากคำสั่ง crontab เสร็จสิ้น
JimmyJames

@JimmyJames สิ่งที่คุณพูดถูกต้อง แต่เหมือนที่ผมอธิบายไว้ข้างต้นทางออกที่ดีคือการเรียกใช้คำสั่งเหล่านี้จาก cron นอกเป็น one-off docker runs มากกว่า container-y :)
Artur Ciesielski

คุณอาจจะถูกต้อง คำถามนั้นน่าสนใจเพราะมันไม่ชัดเจนว่ามันสมเหตุสมผลหรือไม่ที่จะรัน crond ตามคำสั่งของคอนเทนเนอร์ของคุณ มันอาจจะใช้การได้ แต่มันดูน่าอึดอัดใจในภาชนะ
JimmyJames

3

ถ้าคุณเพิ่มนี้/etc/crontabนี้จะไม่แสดงใน crontab ส่วนตัวรากในขณะนี้มีเพียง crontab เฉพาะของผู้ใช้แก้ไขได้ด้วยcrontab -e, /etcไม่ได้เป็นคนทั้งระบบใน


รายละเอียดเพิ่มเติม:

ฉันเดาว่า/pulse/crontab.sh(ซึ่งคุณจะไม่แสดงทำไม?) เพิ่มบรรทัด crontab /etc/crontabที่เกี่ยวข้องกับระบบไฟล์ ต่อมาคุณรันคำสั่งcrontab -lแต่นี้แสดงให้เห็นเพียงความผิดพลาดเพราะมันรายการroots ส่วนบุคคล crontab เท่านั้น (ซึ่งเกิดขึ้นเป็นที่ว่างเปล่า) /etc/crontabไม่ได้เป็นคนทั้งระบบใน ทั้งหมดนี้เป็นปกติอย่างสมบูรณ์และคาดหวัง เพื่อแสดงให้เห็นเส้นสคริปต์ของคุณเพิ่มคุณจะเข้ามาแทนที่ด้วยCMD crontab -lCMD cat /etc/crontab

ทั้งหมดนี้มีอะไรจะไปด้วยคำสั่งใด ๆ dockerfile ชอบADD, RUNหรือCMDมันเป็นสิ่งที่ลินุกซ์เพียงแค่พื้นฐาน


ฉันคิดว่าฉันเข้าใจสิ่งนี้ การตั้งค่าบิลด์ของฉันอยู่ที่ผู้ใช้ แต่การตั้งค่าการรันของฉันกำลังพยายามเรียกใช้จาก crontab ของรูท ที่เหมาะสมฉันจะพยายามหลีกเลี่ยงสิ่งนั้น ฉันเดาว่าคุณไม่ได้หมายความว่า: ADD . /etc/crontabเพราะมันใช้ไม่ได้
TomFirth

@ TomFirth: มันไม่สมเหตุสมผลเลย โปรดอ่านการแก้ไขของฉันสำหรับรายละเอียดเพิ่มเติม
สเวน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.