Dockerコンテナ内で定期的にバッチ処理する
Dockerコンテナ内で定期的なバッチ処理を実行する場合、コンテナでcronを実行できない場合があります。
その場合は、ホストマシン上でcronジョブを作成し、docker execコマンドでコンテナ上のスクリプトを実行することで実現できます。
以下の手順に従って、cronジョブを作成することができます。
1.ホストマシンのdockerコマンドのフルパスを取得
cronジョブではPATHが制限されている場合があるため、フルパスを使用する方がエラーが少なくなります。
which docker コマンドを実行してフルパスを取得します。
# --ホストマシン上で実行します--
which docker
ホストコンピューターのPATHに含まれているDockerコマンドのフルパスが表示されます。例えば、/usr/bin/dockerのような形式です。
# --ホストマシン上の実行結果(例)です--
/usr/bin/docker
Dockerコマンドのフルパスをメモしておきましょう。
2.crontabでdocker execコマンドを設定する
次に、取得したDockerコマンドのフルパスとdocker execコマンドを使用して、cronジョブを設定します。これにより、定期的にバッチファイルをDockerコンテナ内で実行することができます
crontab -e コマンドを実行して、cronジョブを編集します。
# --ホストマシン上で実行します--
crontab -e
crontabファイルが開かれたら、以下のような形式でdocker execコマンドを追加します。
0 9 1 * * /usr/bin/docker exec <container-name> apt update
0 8 * * * /usr/bin/docker exec <container-name> python code.py > log.txt 2>&1
docker execを実行する際の「docker」はフルパスで記述しますが、<container-name>以降のコマンドはコンテナ内で実行され、パスが通っているのでフルパスを記入する必要はありません。
必要に応じて「> log.txt 2>&1」のようにcronの実行ログを任意のテキストに出力して確認することができます。
これで、ホストマシン上で定期的なcronジョブが設定されました。指定したスケジュールに従って、Dockerコンテナ内のバッチファイルが定期的に実行されるようになります。
以上が、Dockerコンテナ内でバッチファイルを定期実行するための手順です。cronを使用することで、ホストマシンから簡単にDockerコンテナ内のバッチ処理を管理することができます。ぜひ、上記の手順を試してみてください。