inch-blog

Welcome to Inch-blog ! Home is a place where you can read mainly technical articles. LIFE is mainly about my personal life.

Docker で cron を用いて定期実行する方法

今回は Python のイメージ上で定期実行する方法を解説します.

開発の大枠の流れは

  1. make build
    1. cron のファイルを仮想環境にコピー
    2. cron を実行する script を仮想環境にコピー
  2. make run-background
    1. docker をバックグラウンドで実行
  3. make run-cron
    1. バックグラウンドで起動しているコンテナに対して exec コマンドを使用して cron を実行する

以下で使用したファイルのコードと簡単な解説を述べる.

Dockerfile

FROM python:3.9.16-slim

RUN apt update && apt-get update && \ 
    apt-get -y install cron

COPY mycron /app/etc/mycron
RUN chmod 0644 /app/etc/mycron
RUN /usr/bin/crontab /app/etc/mycron

COPY workspace/start.sh /app/start.sh
RUN chmod 0644 /app/start.sh

CMD ["bash"]

Dockerfile では

  1. 設定したい cron
  2. cron を開始させるための shell script

を コピーします.

cron

mycron

# cron
SHELL=/bin/sh
* * * * * /app/script.sh >> /app/var/log/cron.log 2>&1
* * * * * /usr/local/bin/python /var/www/workspace/test.py > /app/var/log/python.log 2>&1

今回の例では cron で

  1. script.sh
  2. test.py

を定期実行させます.

python は以下のコマンドで出力された結果を使用しています.

$ which python
# /usr/local/bin/python

cron を開始する script

start.sh で cron job を開始させます.

#!/bin/sh

# Terminate the script on a first error, disallow unbound variables.
set -eu

# Create directory for logs.
mkdir -p /app/var/log

# Load cron configuration.
crontab /app/etc/mycron
echo "Cron has been configured." >> /app/var/log/cron.log

# Start cron as a daemon.
cron
echo "Cron has been started." >> /app/var/log/cron.log

Makefile

# 命名規則 : (dockerhub のアカウント名)/(環境名):(バージョンタグ)
IMAGE_NAME := username/cron_env:1.0
# 命名規則 : (環境名).(使用者の名前)
CONTAINER_NAME := cron_env.firstname

# ビルド
.PHONY: build
build:
	@docker build . -t $(IMAGE_NAME)

# バックグラウンドで起動
.PHONY: run-background
run-background:
	@docker run --rm -itd \
            -u root \
            --name $(CONTAINER_NAME) \
            -v $(shell pwd):/var/www \
            $(IMAGE_NAME)

# バックグラウンドで起動しているコンテナで script を実行
.PHONY: run-cron
run-cron:
	@docker exec -it \
            $(CONTAINER_NAME) \
            sh /app/start.sh

# 起動しているコンテナにログイン
.PHONY: login
login:
	@docker exec -it \
            $(CONTAINER_NAME) \
            /bin/bash

# コンテナを停止
.PHONY: stop
stop:
	@docker stop $(CONTAINER_NAME)

# イメージを削除
.PHONY: remove-image
remove-image:
	@docker image rm $(IMAGE_NAME)

具体的な手順

Docker をバックグラウンドで起動
make run-background

によって docker をバックグラウンドで実行します.

exec コマンドを利用して script を走らせて cron を実行

次に

make run-cron

によって cron を開始します.

起動しているコンテナの中に入る方法

make login

コンテナを止める方法

make stop

イメージを削除する方法

make remove-image