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"]
main.py
の作成
2. 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