DockerでPython開発!毎回`docker build`せずにコードを即時反映する方法
はじめに
Dockerを使ってPythonの開発環境を作成し、スクリプトを実行していたら、「なぜか変更が反映されない!」と困った経験はありませんか?
せっかくコンテナ化して環境を統一したのに、コードを変更するたびに docker build しないといけないのは面倒ですよね。本記事では、この問題がなぜ発生するのかを解説し、解決策として -v オプション(ボリュームマウント)を紹介します。
急いでいる人のためのまとめ
最終的な構成
.
├── Dockerfile
└── main.py
実行手順
docker build -t my-python-app .
docker run -v .:/app my-python-app
問題の発生:変更が反映されない!?
まずは、シンプルなDocker環境でPythonスクリプトを実行してみましょう。
1. Dockerfileの作成
# Pythonの公式イメージを使用
FROM python:3.12.9
# 作業ディレクトリを設定
WORKDIR /app
# スクリプトをコンテナ内にコピー
COPY main.py /app/main.py
# Pythonスクリプトを実行
CMD ["python", "main.py"]
2. main.py の作成
print("Hello, Docker!")
3. ビルドと実行
docker build -t my-python-app .
docker run my-python-app
実行結果:
Hello, Docker!
ここで main.py を修正して、以下のように変更してみます。
print("Hello, Updated Docker!")
再度 docker run my-python-appを実行しても、出力は変わらず Hello, Docker! のままです。
なぜ変更が反映されないのか?
これは COPY コマンドが ビルド時 にファイルをコンテナにコピーするためです。docker run では、すでにビルドされたイメージを元にコンテナが作成されるため、新しい main.py の変更が反映されないのです。
docker run は、docker build で作成されたスナップショット(イメージ)を基に新しいコンテナを作成して実行します。そのため、イメージを更新しない限り、コンテナ内のファイルは変わりません。
この問題を解決するためには、毎回 docker build をやり直す必要がありますが、開発中にそんな手間をかけたくないですよね。
解決策:ボリュームマウント(-v オプション)
-v オプションを使うことで、ホストのディレクトリをコンテナ内にマウントし、リアルタイムで変更を反映できます。
docker run -v .:/app my-python-app
こうすると、ホスト側の main.py を修正すると、コンテナ内の main.py も即座に更新されるため、再ビルドなしで変更を反映できます。
まとめ
✅ COPY はビルド時にのみ動作するため、コードを変更しても docker run では反映されない
✅ 開発中に変更を即時反映させるには、-v オプションでホストとコンテナのファイルを同期する
これにより、スムーズなPython開発環境を構築できる
Dockerを使った開発環境構築の際に、ぜひ -v オプションを活用してください!
Discussion