Dockerを使用してPythonスクリプトを実行する方法

PythonスクリプトDockerを実行

Pythonスクリプトを実行することは、自動化において最も一般的なタスクの1つです。しかし、異なるシステム間で依存関係を管理することは困難です。そこでDockerが登場します。Dockerを使用すると、Pythonスクリプトとその必要な依存関係をすべてコンテナにパッケージ化でき、どのマシンでも同じように実行されることが保証されます。このステップバイステップガイドでは、実際のPythonスクリプトを作成し、それをDockerコンテナ内で実行するプロセスを説明します。

PythonスクリプトにDockerを使用する理由

Pythonスクリプトを扱っていると、物事がすぐに混乱したり複雑になったりすることがあります。異なるプロジェクトには異なるライブラリが必要であり、あなたのマシンで動作するものが他の誰かのマシンでは壊れる可能性があります。Dockerは、スクリプトとその環境を一緒にパッケージ化することでこれを解決します。したがって、「私のマシンでは動作します」と言う代わりに、どこでも同じように動作することを確信できます。

また、システムをクリーンに保つこともできます。すべてのPythonパッケージをグローバルにインストールしたり、バージョンの競合を心配したりする必要はありません。すべてがコンテナ内に留まります。

スクリプトをデプロイしたり、他の誰かに渡したりする場合も、Dockerはそれを簡単にします。セットアップ手順は不要で、「これとあれをインストールしてください」ということもありません。1つのコマンドで実行できます。

Pythonスクリプトを書く

PythonスクリプトとDockerfileを保持するためのプロジェクトディレクトリを作成しましょう。作成したら、cdコマンドを使用してこのディレクトリに移動します:

mkdir docker_file_organizer  
cd docker_file_organizer

ディレクトリをスキャンし、ファイル拡張子に基づいてファイルをフォルダにグループ化する「organize_files.py」という名前のスクリプトを作成します:

nano organize_files.py

次のコードを「organize_file.py」ファイルに貼り付けます。ここでは、ファイルを扱い、動的にディレクトリを作成するために、osshutilという2つの事前構築されたPythonモジュールを使用します:

import os  
import shutil  
  
SOURCE_DIR = "/files"  
  
def organize_by_extension(directory):  
    try:  
        for fname in os.listdir(directory):  
            path = os.path.join(directory, fname)  
            if os.path.isfile(path):  
                ext = fname.split('.')[-1].lower() if '.' in fname else 'no_extension'  
                dest_dir = os.path.join(directory, ext)  
                os.makedirs(dest_dir, exist_ok=True)  
                shutil.move(path, os.path.join(dest_dir, fname))  
                print(f"Moved: {fname} → {ext}/")  
    except Exception as e:  
        print(f"Error organizing files: {e}")  
  
if __name__ == "__main__":  
    organize_by_extension(SOURCE_DIR)

このスクリプトでは、与えられたディレクトリ内のファイルを拡張子に基づいて整理します。osモジュールを使用してファイルをリストし、各アイテムがファイルであるかどうかを確認し、その拡張子を抽出し、既に存在しない場合はそれらの拡張子にちなんだ名前のフォルダを作成します。次に、shutilモジュールを使用して、各ファイルを対応するフォルダに移動します。各移動の際に、ファイルの新しい場所を示すメッセージを印刷します。

Dockerfileを作成する

次に、スクリプトが実行される環境を定義するDockerfileを作成します:

FROM python:latest  
LABEL maintainer="[email protected]"  
WORKDIR /usr/src/app  
COPY organize_files.py .  
CMD ["python", "./organize_files.py"]

このDockerfileを使用して、Pythonを含むコンテナを作成し、スクリプトを追加し、コンテナが起動したときにスクリプトが自動的に実行されるようにします:

Dockerファイルを作成

Dockerイメージをビルドする

Dockerイメージをビルドする前に、まずDockerをインストールする必要があります。その後、次のコマンドを実行して、すべてをDockerイメージにパッケージ化します:

sudo docker build -t file-organizer .

これにより、Dockerfileを読み込み、Pythonのセットアップとスクリプトをまとめて、単一のコンテナイメージで実行できるようにします:

Dockerイメージをビルド

ファイルを含むサンプルフォルダを作成する

スクリプトの動作を確認するために、「sample_files」という名前のテストフォルダを作成し、異なるタイプのいくつかのファイルを追加します。これらのファイルは、フォルダを少し混乱させ、Pythonスクリプトがそれをどのように処理するかを見るために作成しました:

mkdir ~/sample_files  
touch ~/sample_files/test.txt  
touch ~/sample_files/image.jpg  
touch ~/sample_files/data.csv

Docker内でスクリプトを実行する

最後に、Dockerコンテナを実行し、サンプルフォルダをマウントします。-vフラグは、ローカルの「~/sample_files」ディレクトリをコンテナ内の「/files」ディレクトリにマウントし、Pythonスクリプトがホストマシン上のファイルを読み取り、整理できるようにします:

docker run --rm -v ~/sample_files:/files file-organizer

ここでは、--rmオプションを使用して、実行が終了した後にコンテナを自動的に削除し、ディスクスペースを節約します:

最後に、treeコマンドを使用して、ファイルが拡張子に基づいてフォルダに整理されているかどうかを確認します:

tree sample_files

ツリーコマンドで結果を確認

注意: treeコマンドはほとんどのシステムにプリインストールされていません。UbuntuのaptやmacOSのbrewなどのパッケージマネージャを使用して簡単にインストールできます。

最後の考え

Docker内でPythonスクリプトを実行することで、クリーンでポータブル、かつ一貫した開発環境を最大限に活用できます。このコンテナ化されたワークフローを他の自動化タスクに再利用したり、依存関係を心配せずにスクリプトを共有したり、システムを整理された状態に保つことができます。次のステップとして、マルチスクリプトDockerイメージの構築、cronジョブでのコンテナのスケジュール、またはGit、Jenkins、さらにはクラウドプラットフォームなどの他のツールとの統合を検討して、自動化とデプロイメントプロセスを効率化してください。