[Docker] ホストマシンのcronからコンテナ内のphpコマンドを実行する

ネット上ではcronをコンテナ内で内包させる方法が多くありますが、今回はさくっと出来るホストマシンのcronを使った方法を採用しました。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を設置すべきなので、そこは後日エクスプローラ(探検)してみようと思います。