2016-05-03 30 views
8

tôi đã cố gắng để chạy một công việc định kỳ bên trong một container DockerLàm thế nào để chạy một công việc định kỳ bên trong một container Docker

nhưng không làm việc cho tôi

container của tôi chỉ có cron.daily và tập tin cron.weekly

crontab, cron.d, cron.hourly ... vắng mặt trong container của tôi

crontab -e cũng không làm việc

container của tôi chạy với/bin/bash

+0

Bạn đã đọc bất kỳ trang documenation hoặc man nào trên cron (8), crontab (1) hoặc crontab (5)? Điều gì khiến bạn nghĩ rằng bạn cần crontab (1)? Bạn có thể chỉnh sửa crontab (5) của bạn mà không có và chỉ HUP cron (8). Cách khác, tạo hình ảnh của riêng bạn với những hình ảnh được thêm vào. Vì tôi không chắc chắn bạn đã thực hiện ngay cả những nghiên cứu cơ bản nhất, tôi không có xu hướng liệt kê các bước đó, ngoại trừ gợi ý để đọc lên trên Dockerfiles. – Marakai

Trả lời

36

Đây là cách tôi chạy một trong các vùng chứa cron của tôi.

Dockerfile:

FROM alpine:3.3 

ADD crontab.txt /crontab.txt 
ADD script.sh /script.sh 
COPY entry.sh /entry.sh 
RUN chmod 755 /script.sh /entry.sh 
RUN /usr/bin/crontab /crontab.txt 

CMD ["/entry.sh"] 

crontab.txt

*/30 * * * * /script.sh >> /var/log/script.log 

entry.sh

#!/bin/sh 

# start cron 
/usr/sbin/crond -f -l 8 

script.sh

#!/bin/sh 

# code goes here. 
echo "This is a script, run by cron!" 

Build như vậy

docker build -t mycron . 

Run như vậy

docker run -d mycron 

Thêm kịch bản của riêng bạn và chỉnh sửa crontab.txt và chỉ cần xây dựng hình ảnh và chạy. Kể từ khi nó được dựa trên núi cao, hình ảnh là siêu nhỏ.

+0

Thx cho giải pháp! Nó hoạt động tuyệt vời cho trường hợp sử dụng của tôi. –

+0

Tôi không thể upvote đủ. Tôi đã thử rất nhiều cách khác nhau để có được cron chạy trong docker, nó là vô lý. Vấn đề là không có đầu ra khi có sự cố, nhưng giải pháp của bạn chạy chính xác nó ở nền trước và ghi lại các vấn đề! Cảm ơn bạn! – Sarke

6

cảm ơn mẫu này.

Tôi chỉ băn khoăn về một dòng trong entry.sh

/usr/sbin/crond -f -L 8

crond sản lượng -help:

Usage: crond -fbS -l N -d N -L LOGFILE -c DIR 

     -f  Foreground 
     -b  Background (default) 
     -S  Log to syslog (default) 
     -l N Set log level. Most verbose:0, default:8 
     -d N Set log level, log to stderr 
     -L FILE Log to FILE 
     -c DIR Cron dir. Default:/var/spool/cron/crontabs 

như vậy có lẽ bạn muốn thay vì đặt l nhỏ

/usr/sbin/crond -f -l 8

istead của 'L' lớn

/usr/sbin/crond -f -L 8

để thiết lập mức độ đăng nhập mặc định, vì chỉ định một logfile gọi 8 dường như không được mong đợi.

0

crond hoạt động tốt với tiny trên Alpine

RUN apk add --no-cache tini 

ENTRYPOINT ["/sbin/tini", "--"] 
CMD ["/usr/sbin/crond", "-f"] 

nhưng không nên chạy như quá trình chính container (PID 1) vì zombie gặt hái vấn đề và các vấn đề với xử lý tín hiệu. Xem this Docker PRthis blog post để biết chi tiết.

+1

Tại sao không nên chạy dưới dạng PID1? –

Các vấn đề liên quan