LoginSignup
1
1

【cron】DockerのPythonコンテナの中でcronを自動実行する方法

Posted at

はじめに

備忘録
タイトルの通りです。
どなたかのお役に立てれば幸いです。

前提

ファイル構造は以下とします。

srcの中がPythonコンテナのrootです。

python/
  ├─ src/
  │   └─ test.py
  │
  ├─ crontab
  └─ Dockerfile

crontabファイルの中身は以下とします。

上側では、実行された時刻を/var/log/cron.logに出力しています。

下側では、test.pyを実行し、その結果を/var/log/cron.logに出力しています。

crontab
* * * * * /bin/bash -l -c 'echo `date` >> /var/log/cron.log' 2>&1
* * * * * /usr/local/bin/python3 /root/test.py >> /var/log/cron.log 2>&1

test.pyファイルの中身は以下とします。

test.py
print("hello cron")
print('こんにちは')

解決方法

Dockerfileの中に、以下を追加することで実現できました。

vimcronをインストールして、crontabというファイルを/var/spool/cron/crontabs/rootにコピーしています。

その後、コピーしたファイルを一度実行することにより、crontabファイルを読み込ませています。

Dockerfile
RUN apt-get install -y vim cron
COPY crontab /var/spool/cron/crontabs/root
RUN crontab /var/spool/cron/crontabs/root
CMD ["cron", "-f"]

Dockerコンテナを起動し、Pythonコンテナ内でcronが動いているか確認してみます。

$ docker compose up -d --build
[+] Building ...
︙

$ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS   NAMES
a6ba6ff5f53e   python3   "cron -f"   1 minutes ago   Up 1 minutes           python3-1

$ docker container exec -it python3-1 bash
root@a6ba6ff5f53e:~#
root@a6ba6ff5f53e:~# ls
test.py
root@a6ba6ff5f53e:~# service cron status
cron is running.
root@a6ba6ff5f53e:~# tail -f /var/log/cron.log
Mon Apr 22 17:24:01 JST 2024
hello cron
こんにちは
1
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
1
1