Thiết lập cron song song với công việc một lần
Tạo một tệp script, giả sử run.sh, với công việc được cho là chạy định kỳ.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Lưu và thoát.
Sử dụng Entrypoint thay vì CMD
Nếu bạn có nhiều công việc để khởi động trong quá trình chứa docker, hãy sử dụng tệp entrypoint để chạy tất cả.
Tệp nhập điểm là một tệp kịch bản có hiệu lực khi lệnh chạy docker được ban hành. Vì vậy, tất cả các bước mà chúng tôi muốn chạy có thể được đặt trong tệp tập lệnh này.
Chẳng hạn, chúng tôi có 2 công việc để chạy:
Chạy một lần công việc : echo container Docker container đã được khởi động
Chạy công việc định kỳ : run.sh
Tạo 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
Hãy hiểu crontab đã được thiết lập trong tệp
* * * * *
: Lịch trình cron; công việc phải chạy mỗi phút. Bạn có thể cập nhật lịch trình dựa trên yêu cầu của bạn.
/run.sh
: Đường dẫn đến tệp script sẽ được chạy định kỳ
/var/log/cron.log
: Tên tệp để lưu đầu ra của công việc định kỳ theo lịch trình.
2>&1
: Nhật ký lỗi (nếu có) cũng sẽ được chuyển hướng đến cùng một tệp đầu ra được sử dụng ở trên.
Lưu ý : Đừng quên thêm một dòng mới, vì nó làm cho nó trở thành một cron hợp lệ.
Scheduler.txt
: thiết lập cron hoàn chỉnh sẽ được chuyển hướng đến một tệp.
Sử dụng các biến môi trường cụ thể của Hệ thống / Người dùng trong cron
Công việc định kỳ thực tế của tôi đã mong đợi hầu hết các đối số khi các biến môi trường được truyền cho lệnh chạy docker. Nhưng, với bash, tôi không thể sử dụng bất kỳ biến môi trường nào thuộc về hệ thống hoặc bộ chứa docker.
Sau đó, đây là một giải pháp cho vấn đề này:
- Thêm dòng sau vào entrypoint.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- Cập nhật thiết lập cron và chỉ định-
SHELL=/bin/bash
BASH_ENV=/container.env
Cuối cùng, bạn entrypoint.sh
sẽ trông giống như
#!/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
Cuối cùng nhưng không kém phần quan trọng: Tạo 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
Đó là nó. Xây dựng và chạy hình ảnh Docker!
RUN apt-get update && apt-get install cron