5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DockerでPythonをcronで自動実行するまで(Debian)

Last updated at Posted at 2022-03-20

はじめに

Linuxでコマンドを定期的に自動実行するにはcronというものを使うとよいらしい。
しかし、Dockerコンテナ内でPythonをcronをしようとすると意外と大変だったのでメモ。

Dockerコンテナの立ち上げ

Dockerの解説は、さくらのナレッジの解説がわかりやすくておすすめです。

さて、まずは適当な場所で以下のようなディレクトリを作ります。

test/
  ├ docker-compose.yml
  └ Dockerfile

ファイルの中身はそれぞれ、

docker-compose.yml
version: '3'
services:
  main:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: test
    volumes:
      - ./:/workspace
    stdin_open: true
    tty: true
    ports:
    - "127.0.0.1:8000:8888"
Dockerfile
FROM python:3.8
RUN apt update

です。基本的なことしか書いていません。
testフォルダの中で以下のコマンドを打ち、コンテナを作って中に入りましょう。

docker-compose up -d
docker-compose exec main bash

用意したファイルはworkspaceフォルダにあります。

順番に試す

まず、このままだとcronを設定するために必要なコマンドcrontab -eが動きません。

root@34cf5a4ef1fd:/# crontab -e
bash: crontab: command not found

cronをインストールしてやる必要があるようなので以下のコマンドでインストールします。

apt-get install -y cron

もう一回crontab -eを打つと、今度はエディターがないと怒られます。

root@34cf5a4ef1fd:/# crontab -e
no crontab for root - using an empty one
update-alternatives: error: no alternatives for editor
/usr/bin/sensible-editor: 25: editor: not found
/usr/bin/sensible-editor: 28: nano: not found
/usr/bin/sensible-editor: 31: nano-tiny: not found
/usr/bin/sensible-editor: 34: vi: not found
Couldn't find an editor!
Set the $EDITOR environment variable to your desired editor.
crontab: "/usr/bin/sensible-editor" exited with status 1

以下のコマンドでとりあえずvimをインストールします。

apt-get install -y vim

これでcrontab -eが動くようになったので、とりあえずシェルスクリプトを1分ごとに動かしてみます。
テスト用に、/workspaceに以下のシェルスクリプトを用意します。

/workspace/test.sh
#!/bin/bash
echo "hello" >> /workspace/hello.txt

helloという文字列をテキストファイルに追記していくスクリプトです。

次に、crontab -eコマンドで設定ファイルを編集して、以下の分を追記します。
これがcronの設定になります。

crontab -e
*/1 * * * * /workspace/test.sh

1分ごとにシェルスクリプトを実行してくださいという設定です。
パスはフルパスで設定します。

そして、以下のコマンドでcronの定期実行をスタートさせます。

/etc/init.d/cron start

うまく動いていれば、hello.txtが作成され、1分ごとにhelloという文字列が追加されていきます。
止めるときは、

/etc/init.d/cron stop

です。

次にPythonコマンドを動かしてみたいので、/workspaceに.pyファイルを作成します。

/workspace/test.py
with open('/workspace/hello.txt', 'a') as f:
    print('python', file=f)

同じようにpythonという文字列をhello.txtに追記していくプログラムです。
同じようにcrontab -eでcronの設定をしたいのですが、以下の記述だと動きません。

crontab -e
*/1 * * * * python /workspace/test.py

cronがPythonのパスを認識してくれないことが原因のようです。
そこで、which pythonコマンドでpythonファイルの場所を見つけ出して、そこのパスをコマンドとして、以下のように書き直します。

crontab -e
*/1 * * * * /usr/local/bin/python /workspace/test.py

これで動くようになります。

参考にした記事

5
6
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
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?