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 testpyCreating 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 件のコメント:
コメントを投稿