2022年8月30日火曜日

Dockerコンテナ上のPythonアプリをホストのcronで実行する

Dockerコンテナ上のPythonアプリをホストのcronで実行することがあったので、その方法をまとめておく。


環境


Raspberry Pi OS 64bit with desktop。Docker環境はRaspberry Pi OS 64bitでDockerを使うで作成したもの。
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ docker --version
Docker version 20.10.17, build 100c701
$ docker-compose --version
docker-compose version 1.29.2, build unknown


Dockerコンテナの準備

まずはDockerコンテナを準備する。イメージはDocke公式Pythonイメージを使う。docker-compose.yml、Dockerfileの他にapp.pyを用意する。app.pyは「Hello Test」と表示するだけのPythonアプリで、これをコンテナ上で実行する。

version: "3"
services:
  testpy:
    build:
      context: .
      dockerfile: Dockerfile
FROM python:3.10-bullseye

WORKDIR /usr/src/app

COPY . .

CMD [ "python", "./app.py" ]
print('Hello Test')


コンテナ上のアプリを実行する

ファイルの準備ができたら、とりあえずcronを使わずにコンテナ上のアプリを実行してみる。まずはイメージをビルドする。

$ docker-compose build

そしてコンテナ上のアプリを実行してみる。

$ docker-compose run testpy
Creating testpy_testpy_run ... done
Hello Test


ホストでcron設定をする

Dockerコンテナ上のアプリが実行できることを確認できたので、ホストのcronでコンテナを起動する。

まずはコンテナを起動するスクリプトファイル作成する。cronではこのスクリプトファイルを実行する。docker-compose.ymlなどのファイルは~/docker/testpyにあるとする。cronで実行するときはTオプションをつけておかないとエラーになる。

#!/bin/sh

cd ~/docker/testpy
/usr/local/bin/docker-compose run -T testpy

作成したスクリプトに実行権限を付与しておく。

$ chmod u+x testpy.sh

cronの設定

$ crontab -e

ここでは実行結果を後で確認できるように、以下のように出力結果をログに保存しておく。

* * * * * ~/docker/testpy/testpy.sh > ~/testpy.log 2>&1

cronでスクリプトが実行できたらログファイルを確認する。cronでDockerコンテナ上のPythonアプリが実行できた。

$ cat ~/testpy.log
Creating testpy_testpy_run ...
Creating testpy_testpy_run ... done
Hello Test


0 件のコメント:

コメントを投稿