ติดตั้ง cron แบบขนานกับงานขาจร
สร้างไฟล์สคริปต์เรียกใช้ run.sh โดยมีงานที่ควรรันเป็นระยะ
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
บันทึกและออก.
ใช้จุดเข้าใช้งานแทน CMD
หากคุณมีงานหลายอย่างที่จะต้องดำเนินการในระหว่างการจัดเก็บข้อมูลนักเทียบท่าใช้ไฟล์จุดเข้าใช้งานเพื่อเรียกใช้ได้
ไฟล์ Entrypoint เป็นไฟล์สคริปต์ที่เข้าสู่การทำงานเมื่อออกคำสั่งนักเรียกใช้งาน ดังนั้นขั้นตอนทั้งหมดที่เราต้องการเรียกใช้สามารถใส่ในไฟล์สคริปต์นี้
ตัวอย่างเช่นเรามี 2 งานให้ทำงาน:
เรียกใช้ครั้งเดียวงาน : echo“ เริ่มต้นคอนเทนเนอร์ Docker แล้ว”
รันงานเป็นระยะ : run.sh
สร้าง 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
มาทำความเข้าใจกับ crontab ที่ติดตั้งในไฟล์กันดีกว่า
* * * * *
: กำหนดการ Cron; งานต้องทำงานทุกนาที คุณสามารถอัปเดตกำหนดการตามความต้องการของคุณ
/run.sh
: พา ธ ไปยังไฟล์สคริปต์ที่ต้องรันเป็นระยะ
/var/log/cron.log
: ชื่อไฟล์เพื่อบันทึกผลลัพธ์ของงาน cron ที่กำหนดไว้
2>&1
: บันทึกข้อผิดพลาด (ถ้ามี) จะถูกเปลี่ยนเส้นทางไปยังไฟล์เอาต์พุตเดียวกันกับที่ใช้ด้านบน
หมายเหตุ : อย่าลืมเพิ่มบรรทัดใหม่พิเศษเนื่องจากทำให้เป็น cron ที่ถูกต้อง
Scheduler.txt
: การตั้งค่า cron ที่สมบูรณ์จะถูกเปลี่ยนเส้นทางไปยังไฟล์
การใช้ตัวแปรสภาพแวดล้อมเฉพาะของระบบ / ผู้ใช้ใน cron
งาน cron ที่แท้จริงของฉันคาดว่าจะมีข้อโต้แย้งส่วนใหญ่เนื่องจากตัวแปรสภาพแวดล้อมที่ส่งผ่านไปยังคำสั่งเรียกใช้นักเทียบท่า แต่ด้วย bash ฉันไม่สามารถใช้ตัวแปรสภาพแวดล้อมใด ๆ ที่เป็นของระบบหรือคอนเทนเนอร์นักเทียบท่าได้
จากนั้นสิ่งนี้เกิดขึ้นเป็นคำตอบสำหรับปัญหานี้:
- เพิ่มบรรทัดต่อไปนี้ใน entrypoint.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- อัปเดตการตั้งค่า cron และระบุ -
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
สุดท้าย แต่ไม่ท้ายสุด: สร้างไฟล์ 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
แค่นั้นแหละ. สร้างและเรียกใช้ภาพนักเทียบท่า!
RUN apt-get update && apt-get install cron