2015-05-23 20 views
7

Trong khi searching cho vấn đề này tôi thấy rằng: cron -f nên bắt đầu dịch vụ.Tại sao dịch vụ cron trong Dockerfile không chạy?

Vì vậy, tôi có:
RUN apt-get install -qq -y git cron

Tiếp theo, tôi có:
CMD cron -f && crontab -l > pullCron && echo "* * * * * git -C ${HOMEDIR} pull" >> pullCron && crontab pullCron && rm pullCron

dockerfile tôi triển khai mà không có lỗi nhưng cron không chạy. Tôi có thể làm gì để bắt đầu dịch vụ cron với một dòng bổ sung?

PS:
Tôi biết rằng chức năng git trong cron của tôi thực sự phải là một cái móc, nhưng đối với tôi (và có lẽ đối với những người khác) này là về tìm hiểu cách đặt crons với Docker :-)

PPS :
Hoàn Dockerfile (UPDATED):

RUN apt-get update && apt-get upgrade -y 
RUN mkdir -p /var/log/supervisor 
RUN apt-get install -qq -y nginx git supervisor cron wget 
RUN echo "daemon off;" >> /etc/nginx/nginx.conf 
RUN wget -O ./supervisord.conf https://raw.githubusercontent.com/..../supervisord.conf 
RUN mv ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf 
RUN apt-get install software-properties-common -y && apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 && add-apt-repository 'deb http://dl.hhvm.com/ubuntu utopic main' && apt-get update && apt-get install hhvm -y 
RUN cd ${HOMEDIR} && git clone ${GITDIR} && mv ./tybalt/* ./ && rm -r ./tybalt && git init 
RUN echo "* * * * * 'cd ${HOMEDIR} && /usr/bin/git pull origin master'" >> pullCron && crontab pullCron && rm pullCron 
EXPOSE 80 
CMD ["/usr/bin/supervisord"] 

PPPs:
Supervisord.conf:

[supervisord] 
autostart=true 
autorestart=true 
nodaemon=true 

[program:nginx] 
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf 

[program:cron] 
command = cron -f -L 15 
autostart=true 
autorestart=true 
+0

Bản sao: http://stackoverflow.com/questions/20545554/how-do-i-start-cron-on-docker-ubuntu-base – Armand

+0

Xin chào @Armand, tôi đã tìm thấy câu trả lời này, nhưng tôi không ' Tôi hiểu nó trùng lặp như thế nào? Đây thực sự là câu hỏi khiến tôi thêm 'cron -f' vào cuối' CMD' nhưng điều này dường như không chạy –

+0

Docker khởi tạo một cá thể bằng cách sử dụng một tiến trình đơn lẻ. Bạn có thể giải thích như trong lệnh nào bạn bắt đầu dụ với bạn không? Những gì tôi đã học được là nếu bạn cần nhiều tiến trình đang chạy, bạn nên cân nhắc việc chạy trình giám sát từ dòng lệnh và làm cho nó có trách nhiệm cho phép các tiến trình hệ thống bạn muốn có sẵn. – Armand

Trả lời

4

Sau khi bắt đầu crond với người giám sát, bạn công việc cron nên được thực hiện. Dưới đây là các bước khắc phục sự cố bạn có thể thực hiện để đảm bảo rằng cron đang chạy

  1. Trình nền cron có chạy trong vùng chứa không? Đăng nhập vào vùng chứa và chạy ps a | grep cron để tìm hiểu. Sử dụng docker exec -ti CONTAINERID /bin/bash để đăng nhập vào vùng chứa.

  2. Người giám sát có đang chạy không?

  3. Trong ví dụ thiết lập của tôi, cấu hình giám sát sau hoạt động mà không có sự cố. Hình ảnh là ubuntu:14.04. Tôi có CMD ["/usr/bin/supervisord"] trong Dockerfile.
[supervisord] 
nodaemon=true 
[program:crond] 
command = /usr/sbin/cron 
user = root 
autostart = true 
  1. Hãy thử một công việc định kỳ đơn giản để findout liệu vấn đề là mục cron của bạn hoặc đến cron daemon. Thêm này khi đăng nhập vào container với crontab -e:

    * * * * * echo "hi there" >> /tmp/test

  2. Kiểm tra các bản ghi chứa để biết thêm bất kỳ thông tin về cron:

    docker logs CONTAINERID | grep -i cron

Đây chỉ là một vài xử lý sự cố mẹo bạn có thể làm theo.

6

Cron không chạy vì chỉ CMD ghi đè số đầu tiên (như @xuhdev đã nói). Nó được ghi lại ở đây: https://docs.docker.com/reference/builder/#cmd.

Chỉ có thể có một lệnh CMD trong Dockerfile. Nếu bạn liệt kê nhiều hơn một CMD thì chỉ CMD cuối cùng mới có hiệu lực.

Nếu bạn muốn có nginxcron chạy trong cùng một container, bạn sẽ cần phải sử dụng một số loại giám sát (như supervisord hoặc những người khác) mà sẽ là pid 1 quá trình container của bạn và quản lý quy trình chield. Tôi nghĩ rằng dự án này sẽ giúp: https://github.com/nbraquart/docker-nginx-php5-cron (nó dường như làm những gì bạn đang cố gắng để đạt được).

Tùy thuộc vào những gì bạn đang cron là vào đây để, sẽ có giải pháp khác để đó - giống như xây dựng một hình ảnh mới cho mỗi cam kết hoặc mỗi thẻ, vv ...

+0

Cảm ơn, tôi sẽ kiểm tra điều này và lấy lại càng sớm càng tốt. –

+0

Tôi đã cập nhật dockerfile của tôi với giám sát, nó triển khai tốt nhưng cron không chạy, bất kỳ suy nghĩ? (xem PPS cập nhật của tôi trong câu hỏi) Thx –

+0

Có thể phụ thuộc vào cấu hình/nội dung của người giám sát của bạn (và người giám sát phải chạy ở tiền cảnh, với cờ -n) –

0

Tôi đã sử dụng điều này với CentOS và nó hoạt động:

CMD service crond start ; tail -f /var/log/cron 

Phần còn lại của Dockerfile tôi chỉ yum cài đặt cronie và chạm vào tập tin /var/log/cron vì vậy nó sẽ có mặt ở đó khi CMD chạy.

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