buruh pelabuhan - tidak ada crontab untuk root

10

Dockerfile saya muncul untuk membangun dengan benar (itu memberitahu saya begitu). Ketika saya menjalankan wadah, saya mendapatkan pesan kesalahan di bawah ini. Saya telah mencoba menjalankan perintah ( CMD) dengan dan tanpa direktori layanan.

crontab.shpada dasarnya menulis jadwal cron ke file teks ( cron.jobs) dan kemudian mengimpor file teks ke 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 (beberapa crons telah dihapus):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

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

EOF

crontab cron.jobs

Kesalahan:

no crontab for root

Catatan samping:

  • Pulse adalah nama layanan.
  • Versi node sudah tua karena layanan, ini akan ditingkatkan.
  • Layanan ini pada dasarnya untuk pekerjaan cron di node
TomFirth
sumber
Kombinasi serverfault.com/a/851500/395574 dan serverfault.com/a/851479/395574 membantu menyelesaikan masalah ini.
TomFirth

Jawaban:

11

Ini masalah dengan dockerfile (bukan perintah dalam file). Hanya satu CMDyang dijalankan (yang terakhir) - lihat https://docs.docker.com/engine/reference/builder/#cmd

Hanya ada satu instruksi CMD di Dockerfile. Jika Anda mencantumkan lebih dari satu CMD maka hanya CMD terakhir yang akan berlaku.

Paul Haldane
sumber
Ah, dan ada yang di atas segalanya :) Untuk OP: Ini tidak membatalkan penjelasan saya dan Anda pada dasarnya harus mengganti CMDdengan Anda RUN.
Sven
2
Saya pikir untuk menyebut ini masalah sedikit. Perilaku ini adalah dengan desain. Wadah bukan mini-OS. Mereka adalah aplikasi-sentris.
JimmyJames
Sepakat. Maksud saya adalah untuk mengklarifikasi bahwa masalah OP terletak pada konfigurasi buruh pelabuhan mereka daripada rincian cron.
Paul Haldane
Ini bukan masalah buruh pelabuhan . Itu adalah dengan desain.
Andrew Savinykh
5

Seperti jawaban lain telah dijelaskan, hanya satu yang CMDakan dijalankan per Dockerfile dan perintah yang ingin Anda jalankan salah.

Tetapi ada masalah yang lebih mendesak dengan pengaturan IMO Anda - Wadah Docker biasanya tidak dirancang untuk bekerja dengan cara ini. Yang harus Anda lakukan adalah menjalankan layanan cron dari host (atau orkestra Anda) sebagai proses satu kali (mungkin menggunakan sesuatu seperti docker runatau docker-compose run, atau, jika karena alasan tertentu Anda tidak ingin memulai wadah terpisah untuk ini, saya kira kamu bisa menggunakan docker exec).

Ini hanya pandangan saya tentang bagaimana wadah harus digunakan, jadi jelas Anda harus membawanya dengan sebutir garam.

Artur Ciesielski
sumber
2
Saya hanya memiliki keakraban lewat cron tapi saya pikir untuk membuat ini masuk akal, CMD perlu menjalankan crond. Jika tidak, wadah akan keluar setelah perintah crontab selesai.
JimmyJames
@ JimmyJames Apa yang Anda katakan itu benar, tetapi seperti yang saya jelaskan di atas, solusi yang lebih baik adalah menjalankan perintah-perintah ini dari cron luar sebagai satu kali docker run. Lebih banyak wadah-y. :)
Artur Ciesielski
Anda mungkin benar. Pertanyaannya menarik karena tidak jelas apakah masuk akal untuk menjalankan crond sebagai perintah wadah Anda. Mungkin bisa dilakukan tetapi tampaknya canggung dalam wadah.
JimmyJames
3

Jika Anda menambahkan ini /etc/crontab, ini tidak akan muncul di crontab pribadi root, karena ini hanya berisi crontab khusus pengguna yang diedit crontab -e, bukan yang di seluruh sistem /etc.


Keterangan lebih lanjut:

Dugaan saya adalah bahwa /pulse/crontab.sh(yang tidak Anda tunjukkan, mengapa?) Menambahkan baris crontab yang relevan ke file crontab lebar sistem /etc/crontab. Nanti mengeksekusi perintah crontab -l, tapi ini hanya menunjukkan kesalahan karena daftar roots pribadi crontab saja (yang kebetulan kosong), bukan sistem-lebar satu /etc/crontab. Ini semua normal dan diharapkan. Untuk menunjukkan baris yang ditambahkan skrip Anda, Anda akan menggantinya CMD crontab -ldengan CMD cat /etc/crontab.

Semua ini tidak ada hubungannya dengan perintah dockerfile seperti ADD, RUNatau CMD, itu hanya hal-hal dasar Linux.

Sven
sumber
Saya rasa saya mengerti ini. Pengaturan build saya ada di pengguna tetapi pengaturan run saya berusaha dijalankan dari crontab root? itu masuk akal, saya akan mencoba mengatasinya. Saya kira Anda tidak bermaksud: ADD . /etc/crontabkarena itu tidak berhasil.
TomFirth
@TomFirth: Ini tidak masuk akal. Silakan baca edit saya untuk rincian lebih lanjut.
Sven