LoginSignup
0
1

More than 1 year has passed since last update.

Docker+poetry 環境で python スクリプトを cronで定期実行する

Posted at

この記事は何?

Docker内にpoetryでpython環境を構築し、cron でpythonスクリプトを定期実行する処理を作成したときのメモです。

フォルダ構成例

プロジェクト直下に Dockerfileやcrontabを配置し、app フォルダ内に実行スクリプトやpoetry関連ファイルを配置しています。

.
├── app/
│   ├── app.py
│   ├── poetry.lock
│   ├── pyproject.toml
│   └── ...
├── crontab
├── Dockerfile
└── docker-compose.yml

Dockerfile

FROM python:3.9.5-slim-buster


RUN apt update && apt install -y \
    curl \
    busybox-static

# poetryインストール
ENV PYTHONDONTWRITEBYTECODE=1 \
    POETRY_VERSION=1.3.2 \
    PYTHONUNBUFFERED=1
ENV POETRY_HOME=/opt/poetry \
    POETRY_VIRTUALENVS_CREATE=true
ENV PATH=$POETRY_HOME/bin:$PATH
RUN curl -sSL https://install.python-poetry.org/ | python -

# タイムゾーン設定
ENV TZ=Asia/Tokyo

WORKDIR /app
COPY ./app/ .
RUN poetry install

# cron関連
COPY --chown=root:root ./crontab /var/spool/cron/crontabs/root
CMD ["busybox", "crond", "-f", "-L", "/dev/stderr"]

ポイント

  • busybox-static をインストールし、crond を使用可能にしている。
  • cronをそのまま使うとコンテナに設定した環境変数が反映されないが、busybox crond を使用することで特に設定を行わずに環境変数反映が可能。
  • ENV TZ=Asia/Tokyo で日本時間でcronを実行できるように設定。
  • COPY --chown=root:root ./app/crontab /var/spool/cron/crontabs/root で作成した crontab ファイルを実行可能権限をつけて crontabフォルダにコピーしている.
  • CMD ["busybox", "crond", "-f", "-L", "/dev/stderr"] でコンテナを起動するときにcronを実行。フォアグラウンドで実行するための-fフラグと、標準エラーにログを記録するための-L /dev/stderrフラグを指定している。

docker-compose

version: '3.8'

services:
  batch:
    container_name: batch
    build:
      context: .
      dockerfile: ./Dockerfile

crontab 指定例

  • 時刻指定は適当です.
1-59 * * * * cd /app && poetry run python app.py

実行

docker-compose up -d

cronログ確認

docker-compose logs -f

参考

以下を参考にさせていただきました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1