web-dev-qa-db-ja.com

Docker-ルートのcrontabなし

私のDockerfileは正しくビルドされているように見えます(そのように指示されています)。コンテナを実行すると、次のエラーメッセージが表示されます。コマンド(CMD)をサービスのディレクトリありとなしで実行してみました。

crontab.shは基本的にcronスケジュールをテキストファイルに書き込みます(cron.jobs)次に、テキストファイルを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(一部のcronは削除されました):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

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

EOF

crontab cron.jobs

エラー:

no crontab for root

サイドノート:

  • パルスはサービスの名前です。
  • ノードのバージョンがサービスのために古いです。これはアップグレードされます。
  • このサービスは基本的にノードのcronジョブ用です
10
TomFirth

(ファイル内のコマンドではなく)dockerfileの問題です。実行されるCMDは1つだけです(最後のもの)-参照 https://docs.docker.com/engine/reference/builder/#cmd

Dockerfileに含めることができるCMD命令は1つだけです。複数のCMDをリストすると、最後のCMDのみが有効になります。

11
Paul Haldane

他の回答ですでに説明したように、Dockerfileごとに実行されるCMDは1つだけで、実行するコマンドが間違っています。

しかし、セットアップIMOにはより差し迫った問題があります。Dockerコンテナーは通常、このように機能するようには設計されていません。代わりに、ホスト(またはオーケストレーター)からcronサービスを1回限りのプロセスとして(おそらくdocker rundocker-compose runなどを使用して)実行するか、何らかの理由で実行しない場合は、このために別のコンテナを開始したい場合は、docker execを使用できます)。

これは、コンテナの使用方法についての私の見解です。そのため、当然ながら、一粒の塩で服用する必要があります。

5

これを/etc/crontabに追加しても、crontab -eで編集されたユーザー固有のcrontabのみが含まれ、/etcのシステム全体のcrontabは含まれないため、rootの個人用crontabには表示されません。


詳細:

私の推測では、/Pulse/crontab.sh(表示されませんが、なぜですか?)は、システム全体のcrontabファイル/etc/crontabに関連するcrontab行を追加します。後でコマンドcrontab -lを実行しますが、roots personal crontabのみ(たまたま空)がリストされているため、エラーのみが表示され、/etc/crontabのシステム全体のコマンドは表示されません。これはすべて完全に正常であり、予期されていることです。スクリプトが追加した行を表示するには、CMD crontab -lCMD cat /etc/crontabに置き換えます。

これらすべては、ADDRUNCMDなどのdockerfileコマンドとは何の関係もありません。これはLinuxの基本的なものにすぎません。

3
Sven