この記事は何?
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
参考
以下を参考にさせていただきました。