docker - root için crontab yok


10

Dockerfile'ım doğru bir şekilde oluşturulmuş gibi görünüyor (bunu söylüyor). Kapsayıcıyı çalıştırdığımda, aşağıdaki hata iletisini alıyorum. CMDHizmet dizini olan ve olmayan komutları ( ) çalıştırmayı denedim .

crontab.shtemel olarak bir cron zamanlamasını bir metin dosyasına ( cron.jobs) yazar ve sonra metin dosyasını crontab'a alır.

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 (bazı crons kaldırıldı):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

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

EOF

crontab cron.jobs

Hata:

no crontab for root

Yan notlar:

  • Darbe, hizmetin adıdır.
  • Hizmet nedeniyle düğümün sürümü eski, bu yükseltilecek.
  • Hizmet esasen düğümdeki cron işleri içindir

Serverfault.com/a/851500/395574 ve serverfault.com/a/851479/395574 kombinasyonu bu sorunun çözülmesine yardımcı oldu.
TomFirth

Yanıtlar:


11

Bu dockerfile ile ilgili bir sorundur (dosyadaki komutlar yerine). Yalnızca bir CMDtanesi çalıştırılır (sonuncusu) - bkz. Https://docs.docker.com/engine/reference/builder/#cmd

Dockerfile dosyasında yalnızca bir CMD komutu olabilir. Birden fazla CMD listelerseniz, yalnızca son CMD geçerli olur.


Ah, ve her şeyden önce var :) OP için: Bu benim açıklamamı geçersiz kılmaz ve esasen sizin CMDile değiştirmek zorunda kalacak RUN.
Sven

2
Bunu bir sorun olarak adlandırmak biraz uzak olduğunu düşünüyorum. Bu davranış tasarım gereğidir. Kaplar mini işletim sistemi değildir. Uygulama merkezlidirler.
JimmyJames

Kabul. Niyetim, OP'nin probleminin cron'un herhangi bir detayından ziyade docker konfigürasyonunda yattığını açıklamaktı.
Paul Haldane

Bu bir liman işçisi sorunu değil . Tasarım gereğidir.
Andrew Savinykh

5

Diğer yanıtlar daha önce açıklandığı gibi, CMDDockerfile başına yalnızca bir tane çalıştırılacak ve çalıştırmak istediğiniz komut yanlış.

Ancak kurulumunuzda daha acil bir sorun var IMO - Docker kapları genellikle bu şekilde çalışmak üzere tasarlanmamıştır. Bunun yerine yapmanız gereken cron hizmetlerini ana bilgisayardan (veya orkestratörünüzden) tek seferlik işlemler olarak çalıştırmaktır (muhtemelen docker runveya gibi bir şey kullanarak veya docker-compose runherhangi bir nedenle bunun için ayrı bir kapsayıcı başlatmak istemiyorsanız, ben sanırım kullanabilirsiniz docker exec).

Bu sadece kapların nasıl kullanılması gerektiğine dair benim görüşüm, bu yüzden açıkça bir tuz tanesi ile almalısın.


2
Cron'a sadece geçici bir aşinam var, ancak bunu mantıklı hale getirmek için CMD'nin crond çalıştırması gerektiğini düşünüyorum. Aksi takdirde, kap crontab komutu bittikten sonra çıkacaktır.
JimmyJames

@JimmyJames Söyledikleriniz doğru, ama yukarıda açıkladığım gibi, bu komutları dış crondan bir kerelik docker runs olarak çalıştırmak daha iyi bir çözümdür . Daha fazla konteyner-y. :)
Artur Ciesielski

Haklı olabilirsin. Soru ilginçtir, çünkü crond'u kapsayıcınızın komutu olarak çalıştırmanın mantıklı olup olmadığı açık değildir. Çalışabilir olabilir, ancak bir kapta garip görünüyor.
JimmyJames

3

Bunu buna eklerseniz /etc/crontab, kökün kişisel crontab'ında görünmez, çünkü bu yalnızca crontab -esistem tarafından düzenlenmiş kullanıcıya özel crontab'ı içerir /etc.


Daha fazla detay:

Benim tahminim /pulse/crontab.sh(hangi göstermezsiniz, neden?) İlgili crontab satırını sistem genelindeki crontab dosyasına ekler /etc/crontab. Daha sonra komutu çalıştırmak crontab -l, ancak listelerini çünkü bu sadece bir hata gösteriyor rootler kişisel crontab sadece (boş olur ki), değil sistem genelinde bir /etc/crontab. Bu tamamen normal ve beklenen bir durum. Komut dosyanızın eklediği satırı göstermek için CMD crontab -lile değiştirin CMD cat /etc/crontab.

Tüm bunların dockerfile komutları ile ilgisi yoktur ADD, RUNya da CMDsadece temel Linux şeyleridir.


Sanırım bunu anlıyorum. Derleme ayarlarım kullanıcıda ancak çalıştırma ayarlarım kökün crontab'ından mı çalıştırılmaya çalışıyor? bu mantıklı, bunun üzerinde çalışmayı deneyeceğim Sanırım demek istemedin: ADD . /etc/crontabçünkü bu işe yaramıyor.
TomFirth

@TomFirth: Bu pek mantıklı değil. Daha fazla bilgi için lütfen düzenlememi okuyun.
Sven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.