Docker-ルートのcrontabなし


10

私の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

サイドノート:

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

serverfault.com/a/851500/395574serverfault.com/a/851479/395574の組み合わせは、これを解決するのに役立ちました。
TomFirth 2017年

回答:


11

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

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


ああ、それは他のすべて:)にOPの上にあります:これは私の説明を無効にしないと、あなたは、本質的にあなたを交換しなければならないCMDRUN
スヴェン

2
これを問題と呼ぶのは少しずれています。この動作は仕様です。コンテナはミニOSではありません。それらはアプリケーション中心です。
JimmyJames、2017年

同意した。私の意図は、OPの問題がcronの詳細ではなく、Docker構成にあることを明確にすることでした。
ポールハルデン

これはDockerの問題ではありません。仕様によるものです。
Andrew Savinykh 2017年

5

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

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

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


2
私はただcronに精通しているだけですが、これを賢明にするためには、CMDはcrondを実行する必要があると思います。それ以外の場合、コンテナーはcrontabコマンドの終了後に終了します。
JimmyJames

@JimmyJamesあなたの言っていることは正しいですが、上記で説明したように、より良い解決策は、外部のcronからこれらのコマンドを1回限りdocker runのs として実行することです。もっとコンテナ-y。:)
Artur Ciesielski

あなたは正しいかもしれません。コンテナーのコマンドとしてcrondを実行することが理にかなっているかどうかが明確でないため、この質問は興味深いものです。動作するかもしれませんが、コンテナでは扱いにくいようです。
JimmyJames 2017年

3

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


詳細:

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

これらすべてはADDRUNやのようなdockerfileコマンドとは何の関係もありません。これはCMD単なるLinuxの基本的なものです。


私はこれを理解していると思います。ビルド設定はユーザーのものですが、実行設定はルートのcrontabから実行しようとしていますか?それは理にかなっている、私はそれを回避しようとします。私はあなたがそうではなかったと思います:それはうまくいきADD . /etc/crontabません。
TomFirth

@TomFirth:これはあまり意味がありません。詳細については、編集内容をお読みください。
スヴェン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.