web-dev-qa-db-ja.com

異なるホスト上のDockerでcronを実行する際の問題

Cronjobを管理するためにDockerコンテナを実行しようとしています

centOS6.5ベースを使用してDockerコンテナでテストとして非常に単純なcronを実行しているim

* * * * * /bin/echo "it works!" >> test.log

コンテナーがCoreOSホストで実行されている場合は正常に機能しますが、ubuntu 13.10ホストでコンテナーを実行すると、cronが実行されません。 (ホストはコンテナーで実行されているものに影響を与えませんでしたが)

両方のホストがdocker0.8を実行しています

私は明らかな何かを見逃していますか、それともこれはバグですか?

ありがとう

26
dwitz

短い答え

この行を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を再起動すると、すべて正常になります

44
dwitz

@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 
1
helvete

ベースのDockerコンテナはcronのようなサービスを開始しません-それらはENTRYPOINT/CMDで指定したものだけを開始します

一部の「太い」コンテナは、監視対象などを使用してサービスを開始しますが、可能であれば、サービスを異なるコンテナに分割し、ボリュームコンテナと使用してデータを共有する方が保守しやすくなります。

1
SvenDowideit

私の場合、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/*

そしてブーム!

0
sMajeed