Dockerfile

Dockerfile

nginx私はドッカーを使用しています。cronSSL証明書とDNS登録を更新するようにタスクを設定しました。ただし、cronジョブは実行されていません。

私は何をしました。このインターンDockerfileに基づいてベースを作成しました。最初は実行されると仮定してインストールしましたが、サービスが起動していないことがわかりました(initサブシステムがインストールされておらず、debian:stretch-slimが非常に小さかった)。だからstartにコードを追加しました。コンテナが実行中かどうかを尋ねる場合は、「はい」と答えます。arm32v7/nginxdebian:stretch-slimcroncroncron

#ctrl-alt-delor@raspberrypi:~/a_website/docker$
#↳ docker exec -it $(docker container ls | sed -nr -e 's/.*(website-stack.*)/\1/p') service cron status
[ ok ] cron is running.

ただし、私が追加したジョブのログは表示されませんcron

を実行すると、ジョブが実行run-parts --report /etc/cron.dailyされ、ログ出力が生成されます。だからまだcron実行されていないようです。

#ctrl-alt-delor@raspberrypi:~/a_website/docker$
#↳ docker exec -it $(docker container ls | sed -nr -e 's/.*(website-stack.*)/\1/p') cat /proc/12/cmdline; echo
/usr/sbin/cron

それでは、cronジョブを実行してみてはいかがでしょうか?私が逃したものは何ですか?

Dockerfile

FROM arm32v7/nginx

##add backports
COPY stretch-backports-source.list /etc/apt/sources.list.d/

##install cron and curl — so we can register dns regularly
RUN     apt-get update &&\
        apt-get install -y cron curl &&\
        apt-get clean

##setup cron to register dns
COPY register-dns register-dns.auth register-dns-hostname /usr/local/bin/
COPY register-dns.cron /etc/cron.daily/1-register-dns
RUN chmod +x /usr/local/bin/register-dns /etc/cron.daily/1-register-dns

##add curtbot
RUN apt-get update && \
    apt-get -t stretch-backports install -y python-certbot-nginx && \
    apt-get clean


#add ssl port
EXPOSE 443 80

##custom entry point — needed by cron
COPY entrypoint /entrypoint
RUN chmod +x /entrypoint
ENTRYPOINT ["/entrypoint"]
CMD ["nginx", "-g", "daemon off;"] #:tricky: we seem to need to re-specify this

LABEL name="my-nginx" \
      description="nginx + cron + curl + certbot + dns-registering"

entrypoint

#!/bin/sh

## Do whatever you need with env vars here ...
service cron start

# Hand off to the CMD
exec "$@"

/etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

/etc/cron.daily/1-register-dns

#!/bin/sh
date >> /var/log/register-dns
/usr/local/bin/register-dns >>/var/log/register-dns

答え1

どのエラーが発生したかを確認するためにインストールしましたが、rsyslog次のような結果が出ました。

(*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab)。一部の検索では、cronファイルへのハードリンクが多いとセキュリティポリシーが機能しないと述べています。残念ながら、Dockerの階層化されたファイルシステムのため、ファイルには多くのハードリンクが含まれています。

この問題を解決するために、実行touch /etc/crontab /etc/cron.*/*する前に起動スクリプトに追加しましたcron。これにより、他のファイルインスタンスとの接続が失われます。

新しいエントリポイントは

#!/bin/sh

#fix link-count, as cron is being a pain, and docker is making hardlink count >0 (very high)
touch /etc/crontab /etc/cron.*/*

service cron start

# Hand off to the CMD
exec "$@"

テストしてみましたが動作します。

一般化する

cron仕事に行くにはこれを行う必要があります。

  • インストールcron- インストールされていない場合
  • クローンタスク/etc/cron.daily/(または毎週)を追加します。スクリプト名に文字、数字、ハイフンのみが含まれていることを確認してください。ポイントがない。 (聞かないで)見てくださいcron.daily では cron ジョブは実行されません。
  • 構成ファイルのハードリンク数をcron1に減らします。 do touch /etc/crontab /etc/cron.*/*- (docker にある場合) 起動スクリプトに入れました。
  • 開始cronservice cron start— (基本OSの場合、初期化はありません。dockerで使用される多くの基本イメージと同じです)。起動スクリプトに入れました。

この答えのエントリポイントスクリプトと質問の他のすべての項目がこれを行います。現在のプロジェクトは次の方法で入手できますhg clone ssh://[email protected]/davids_dad/a_website

関連情報