docker - không có crontab cho root


10

Dockerfile của tôi dường như được xây dựng chính xác (nó cho tôi biết như vậy). Khi tôi chạy container, tôi nhận được thông báo lỗi dưới đây. Tôi đã thử chạy các lệnh ( CMD) có và không có thư mục của dịch vụ.

crontab.shvề cơ bản ghi một lịch trình cron vào một tệp văn bản ( cron.jobs) và sau đó nhập tệp văn bản vào 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 (một số crons đã bị xóa):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1

EOF

crontab cron.jobs

Lỗi:

no crontab for root

Ghi chú bên:

  • Pulse là tên của dịch vụ.
  • Phiên bản của nút đã cũ do dịch vụ, điều này sẽ được nâng cấp.
  • Dịch vụ này chủ yếu dành cho các công việc cron trong nút

Một sự kết hợp của serverfault.com/a/851500/395574serverfault.com/a/851479/395574 đã giúp giải quyết vấn đề này.
TomFirth

Câu trả lời:


11

Đó là một vấn đề với dockerfile (chứ không phải là các lệnh trong tệp). Chỉ có một cái CMDđược chạy (cái cuối cùng) - xem https://docs.docker.com/engine/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ỉ có CMD cuối cùng có hiệu lực.


À, và có một thứ nằm trên tất cả mọi thứ khác :) Đối với OP: Điều này không làm mất hiệu lực giải thích của tôi và về cơ bản bạn sẽ phải thay thế CMDbằng RUN.
Sven

2
Tôi nghĩ để gọi đây là một vấn đề là một chút. Hành vi này là do thiết kế. Các container không phải là hệ điều hành mini. Họ là trung tâm ứng dụng.
JimmyJames

Đã đồng ý. Ý định của tôi là làm rõ rằng vấn đề của OP nằm trong cấu hình docker của họ chứ không phải là bất kỳ chi tiết nào về cron.
Paul Haldane

Đây không phải là một vấn đề docker . Đó là do thiết kế.
Andrew Savinykh

5

Như các câu trả lời khác đã giải thích, chỉ có một câu trả lời CMDsẽ được chạy trên Dockerfile và lệnh bạn muốn chạy là sai.

Nhưng có một vấn đề cấp bách hơn với thiết lập IMO của bạn - Các thùng chứa Docker thường không được thiết kế để hoạt động theo cách này. Thay vào đó, những gì bạn nên làm là chạy các dịch vụ cron từ máy chủ (hoặc người điều phối) của bạn dưới dạng các quy trình một lần (có thể sử dụng một cái gì đó như docker runhoặc docker-compose run, hoặc vì lý do nào đó bạn không muốn bắt đầu một thùng chứa riêng cho việc này, tôi đoán bạn có thể sử dụng docker exec).

Đây chỉ là quan điểm của tôi về cách sử dụng các thùng chứa, vì vậy rõ ràng bạn nên dùng nó với một hạt muối.


2
Tôi chỉ có một sự quen thuộc với cron nhưng tôi nghĩ để làm cho điều này trở nên hợp lý, thì CMD sẽ cần phải chạy crond. Nếu không, container sẽ thoát sau khi lệnh crontab kết thúc.
JimmyJames

@JimmyJames Những gì bạn đang nói là chính xác, nhưng như tôi đã giải thích ở trên, giải pháp tốt hơn là chạy các lệnh này từ một cron bên ngoài dưới dạng một lần docker run. Thêm container-y. :)
Artur Ciesielski

Bạn có thể đúng. Câu hỏi rất thú vị bởi vì không rõ liệu có hợp lý khi chạy crond như lệnh của bạn không. Nó có thể hoàn toàn khả thi nhưng có vẻ khó xử trong một container.
JimmyJames

3

Nếu bạn thêm cái này vào /etc/crontab, cái này sẽ không hiển thị trong crontab cá nhân của root, vì cái này chỉ chứa crontab dành riêng cho người dùng được chỉnh sửa crontab -e, chứ không phải toàn bộ hệ thống trong /etc.


Thêm chi tiết:

Tôi đoán là /pulse/crontab.sh(mà bạn không hiển thị, tại sao?) Thêm dòng crontab có liên quan vào tệp crontab trên toàn hệ thống /etc/crontab. Sau đó bạn thực hiện lệnh crontab -l, nhưng điều này chỉ cho thấy một lỗi bởi vì nó liệt kê rootcủa cá nhân crontab chỉ (mà sẽ xảy ra là trống), không phải là một hệ thống rộng rãi trong /etc/crontab. Đây là tất cả hoàn toàn bình thường và mong đợi. Để hiển thị dòng mà tập lệnh của bạn đã thêm, bạn sẽ thay thế CMD crontab -lbằng CMD cat /etc/crontab.

Tất cả những điều này không liên quan gì đến bất kỳ lệnh dockerfile nào ADD, RUNhoặc CMD, đó chỉ là những thứ cơ bản của Linux.


Tôi nghĩ rằng tôi hiểu điều này. Cài đặt bản dựng của tôi là trên người dùng nhưng cài đặt chạy của tôi đang cố chạy từ crontab của root? Điều đó có ý nghĩa, tôi sẽ cố gắng giải quyết vấn đề đó. Tôi đoán bạn không có ý: ADD . /etc/crontabvì điều đó không làm việc.
TomFirth

@TomFirth: Điều này không có nhiều ý nghĩa. Xin vui lòng đọc chỉnh sửa của tôi để biết thêm chi tiết.
Sven
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.