[Docker] ホストマシンのcronからコンテナ内のphpコマンドを実行する
ネット上ではcronをコンテナ内で内包させる方法が多くありますが、今回はさくっと出来るホストマシンのcronを使った方法を採用しました。
更新日: 2018.7.17公開日: 2017.11.28
dockerコンテナの性質から考えると、cronごとコンテナをポータブルさせたほうがメンテナンス性が高いのですが、とりあえず動かしたい時用ということで。
docker exec -tコマンドをcronに記述するだけ!
先に答えを言ってしまいますと、やり方は簡単で、
docker exec -tコマンドをcronから実行する
それだけです。
docker execコマンドがわからない方は、公式マニュアルをどうぞ。
肝なのは、docker execコマンドでよく使われる引数「-it」(インタラクティブモードでコンテナ内に入る)ではなく、「-t」です。
引数「-i」を入れてしまうと
the input device is not a TTY
と怒られてしまいます。
まずはdockerコマンドのテスト
とりあえず、cronで実行したいコマンドをターミナルから直で実行してみます。
今回はテストなので、「cron start!」と表示するだけのcron.phpを実行させます。
コンテナは、公式の「php:7-apache」イメージを使っています。
<?php
echo 'cron start!'
docker execコマンドで実行します。
docker exec -t {コンテナID} php cron.php
cron start!
無事表示されました。
cron.phpのあとに半角スペースを空ければ変数を渡すこともできます。標準のターミナルと一緒ですね。
cronに設定
続いて、crontabに設定を書きます。
dockerのパスを確認
dockerコマンドはcron内ではフルパスが必要なので、確認します。
which docker
/usr/bin/docker
cronに設定を書き込む
10 1 * * * /usr/bin/docker exec -t {コンテナID} php cron.php
これでOK。
実際に運用する際は、実行結果をログに残しておきたいので、
10 1 * * * /usr/bin/docker exec -t {コンテナID} php cron.php > /home/user/stderr
などとして、ログを記録するとエラーが起こった時に便利です。
dockerでcronって難しいイメージでしたが、ホストマシンのcronを使う限りは簡単でした。
コンテナのポータビリティを上げるためには、コンテナ内にcronを設置すべきなので、そこは後日エクスプローラ(探検)してみようと思います。