今回は Python のイメージ上で定期実行する方法を解説します.
開発の大枠の流れは
-
make build
- cron のファイルを仮想環境にコピー
-
cron を実行する
script
を仮想環境にコピー
-
make run-background
-
docker
をバックグラウンドで実行
-
-
make run-cron
-
バックグラウンドで起動しているコンテナに対して
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 では
- 設定したい cron
- 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 で
-
script.sh
-
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