nginx
私はドッカーを使用しています。cron
SSL証明書とDNS登録を更新するようにタスクを設定しました。ただし、cron
ジョブは実行されていません。
私は何をしました。このインターンDockerfile
に基づいてベースを作成しました。最初は実行されると仮定してインストールしましたが、サービスが起動していないことがわかりました(initサブシステムがインストールされておらず、debian:stretch-slimが非常に小さかった)。だからstartにコードを追加しました。コンテナが実行中かどうかを尋ねる場合は、「はい」と答えます。arm32v7/nginx
debian:stretch-slim
cron
cron
cron
#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 ジョブは実行されません。 - 構成ファイルのハードリンク数を
cron
1に減らします。 dotouch /etc/crontab /etc/cron.*/*
- (docker にある場合) 起動スクリプトに入れました。 - 開始
cron
:service cron start
— (基本OSの場合、初期化はありません。dockerで使用される多くの基本イメージと同じです)。起動スクリプトに入れました。
この答えのエントリポイントスクリプトと質問の他のすべての項目がこれを行います。現在のプロジェクトは次の方法で入手できますhg clone ssh://[email protected]/davids_dad/a_website