Cronjobを管理するためにDockerコンテナを実行しようとしています
centOS6.5ベースを使用してDockerコンテナでテストとして非常に単純なcronを実行しているim
* * * * * /bin/echo "it works!" >> test.log
コンテナーがCoreOSホストで実行されている場合は正常に機能しますが、ubuntu 13.10ホストでコンテナーを実行すると、cronが実行されません。 (ホストはコンテナーで実行されているものに影響を与えませんでしたが)
両方のホストがdocker0.8を実行しています
私は明らかな何かを見逃していますか、それともこれはバグですか?
ありがとう
短い答え
この行をdockerfileに追加します
RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so' /etc/pam.d/crond
長い答え
私が理解していることから、問題はCoreOSとUnbutuのカーネルの違いに関連しています。これにより、pamセキュリティの問題が発生します。
それを理解するために、最初にcronのロギングをオンにする必要がありました(dockerにいるため、通常の起動は実行されません)。実行
service rsyslog start
service crond restart
cronログにこのエラーがありました(ここ/ var/log/cronにあります)
FAILED to open PAM security session (Cannot make/remove an entry for the specified session)
そこで、セキュリティログを調べたところ、このエラーが発生しました(/ var/log/secureにあります)。
pam_loginuid(crond:session): set_loginuid failed
もう少しグーグルして、pam cond config(ここ/etc/pam.d/crondにあります)を変更する必要があることがわかりました。このファイルを編集して、次の行をコメントアウトしてください。
#session required pam_loginuid.so
crondを再起動すると、すべて正常になります
@dwitzの答えは正しいですが、Dockerコンテナ内のUbuntu 16.04で機能するように、sed
コマンドを少し変更する必要がありました。
cat /etc/pam.d/cron |sed -e "s/required pam_loginuid.so/optional pam_loginuid.so/g" > /tmp/cron && mv /tmp/cron /etc/pam.d/cron
ベースのDockerコンテナはcronのようなサービスを開始しません-それらはENTRYPOINT/CMDで指定したものだけを開始します
一部の「太い」コンテナは、監視対象などを使用してサービスを開始しますが、可能であれば、サービスを異なるコンテナに分割し、ボリュームコンテナと使用してデータを共有する方が保守しやすくなります。
私の場合、cronをデバッグします。
$ apt-get install rsyslog
$ rsyslogd
$ service cron restart
$ tail -f /var/log/syslog
そして、ログにNUMBER OF HARD LINKS > 1
エラーが見つかりました。
解決策はこれをentrypoint.sh
に入れることでした
touch /etc/crontab /etc/cron.d/*
そしてブーム!