私の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
サイドノート:
(ファイル内のコマンドではなく)dockerfileの問題です。実行されるCMD
は1つだけです(最後のもの)-参照 https://docs.docker.com/engine/reference/builder/#cmd
Dockerfileに含めることができるCMD命令は1つだけです。複数のCMDをリストすると、最後のCMDのみが有効になります。
他の回答ですでに説明したように、Dockerfileごとに実行されるCMD
は1つだけで、実行するコマンドが間違っています。
しかし、セットアップIMOにはより差し迫った問題があります。Dockerコンテナーは通常、このように機能するようには設計されていません。代わりに、ホスト(またはオーケストレーター)からcronサービスを1回限りのプロセスとして(おそらくdocker run
やdocker-compose run
などを使用して)実行するか、何らかの理由で実行しない場合は、このために別のコンテナを開始したい場合は、docker exec
を使用できます)。
これは、コンテナの使用方法についての私の見解です。そのため、当然ながら、一粒の塩で服用する必要があります。
これを/etc/crontab
に追加しても、crontab -e
で編集されたユーザー固有のcrontabのみが含まれ、/etc
のシステム全体のcrontabは含まれないため、rootの個人用crontabには表示されません。
詳細:
私の推測では、/Pulse/crontab.sh
(表示されませんが、なぜですか?)は、システム全体のcrontabファイル/etc/crontab
に関連するcrontab行を追加します。後でコマンドcrontab -l
を実行しますが、root
s personal crontabのみ(たまたま空)がリストされているため、エラーのみが表示され、/etc/crontab
のシステム全体のコマンドは表示されません。これはすべて完全に正常であり、予期されていることです。スクリプトが追加した行を表示するには、CMD crontab -l
をCMD cat /etc/crontab
に置き換えます。
これらすべては、ADD
、RUN
、CMD
などのdockerfileコマンドとは何の関係もありません。これはLinuxの基本的なものにすぎません。