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/395574とserverfault.com/a/851479/395574の組み合わせは、これを解決するのに役立ちました。
— TomFirth 2017年

回答:


11

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

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


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

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 -lとCMD cat /etc/crontab。

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


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

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