はじめに
この実験では、ファイル変更に応じて Docker サービスを自動的にリビルドおよび更新するためにdocker compose watchコマンドを活用する方法を学びます。まず、基本的なアプリケーションファイル、Dockerfile、docker-compose.yamlファイルを含むビルドコンテキストを使用して、シンプルな Docker Compose プロジェクトをセットアップします。
プロジェクトのセットアップ後、docker compose watchのコア機能を探索し、ファイル変更を監視して自動リビルドをトリガーする方法を確認します。また、初期サービス起動なしで変更を監視する--no-upオプションや、ビルド出力を抑制してウォッチ動作をよりクリーンに観察できる--quietオプションについても検討します。
ビルドコンテキストを含むシンプルな Docker Compose プロジェクトを準備する
このステップでは、ビルドコンテキストを含むシンプルな Docker Compose プロジェクトを準備します。ビルドコンテキストとは、Docker イメージをビルドするために Docker デーモンに送信される指定場所(PATH または URL)のファイルセットです。Dockerfile とそれが必要とするファイル(アプリケーションコードなど)はビルドコンテキスト内に存在する必要があるため、これは重要です。
まず、プロジェクト用のディレクトリを作成します。my-watch-appという名前にします。
mkdir ~/project/my-watch-app
cd ~/project/my-watch-app
次に、シンプルなアプリケーションファイルを作成します。メッセージを表示する基本的な Python スクリプトを使用します。
nano app.py
app.pyに以下の内容を追加します:
print("Hello from the Docker container!")
ファイルを保存して閉じます(Ctrl+X、Y、Enter)。
次に、アプリケーション用のイメージをビルドする Dockerfile を作成します。Dockerfile は Python スクリプトをイメージにコピーし、実行します。
nano Dockerfile
Dockerfile に以下の内容を追加します:
FROM python:3.9-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
この Dockerfile は、ベースイメージとして slim 版の Python 3.9 を使用し、作業ディレクトリを/appに設定し、app.pyを/appディレクトリにコピーし、コンテナ起動時に Python スクリプトを実行するコマンドを設定します。
最後に、サービスを定義するdocker-compose.yamlファイルを作成します。このファイルは Docker Compose にアプリケーションのビルドと実行方法を指示します。
nano docker-compose.yaml
docker-compose.yamlに以下の内容を追加します:
version: "3.8"
services:
myapp:
build: .
volumes:
- .:/app
このdocker-compose.yamlファイルはmyappという名前のサービスを定義しています。build: .命令は、カレントディレクトリ(ビルドコンテキスト)にある Dockerfile を使用してイメージをビルドするよう Docker Compose に指示します。volumes: - .:/app行は、ホストマシンのカレントディレクトリ(.)をコンテナ内の/appディレクトリにマウントします。これはdocker compose watchにとって重要で、ホスト上の変更がコンテナ内に反映されるようになります。
では、Docker Compose を使用してサービスをビルド・実行し、すべてが正しく設定されていることを確認しましょう。Docker Compose がプリインストールされていないため、まずインストールする必要があります。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
これでdocker-composeを使用できます。
docker-compose up --build
イメージがビルドされ、コンテナが実行され、"Hello from the Docker container!"と表示される出力が表示されるはずです。コンテナを停止するにはCtrl+Cを押します。
docker compose watch を使用してファイル変更を監視しリビルドする
このステップでは、docker compose watch コマンドを使用して、アプリケーションコードを変更した際にサービスを自動的にリビルド・再起動する方法を学びます。これは開発ワークフローにおいて強力な機能で、迅速な反復開発を可能にします。
docker compose watch コマンドはビルドコンテキスト内のファイルを監視し、変更を検知すると自動的にイメージをリビルドしてサービスを再起動します。
まず、~/project/my-watch-app ディレクトリにいることを確認してください。
cd ~/project/my-watch-app
次に、docker compose watch コマンドを実行します。
docker-compose watch
Docker Compose がサービスを起動し、ファイル変更を監視していることを示す出力が表示されます。初期の出力は docker-compose up を実行したときと同様です。
docker compose watch がターミナルで実行されている状態で、別のターミナルまたはタブを開きます。新しいターミナルでプロジェクトディレクトリに移動します。
cd ~/project/my-watch-app
では、app.py ファイルを変更してみましょう。
nano app.py
内容を以下のように変更します:
print("Hello again from the updated Docker container!")
ファイルを保存して閉じます(Ctrl+X、Y、Enter)。
docker compose watch を実行しているターミナルに戻ると、変更が検知され、イメージがリビルドされ、コンテナが再起動される様子が出力に表示されます。再起動後、新しいメッセージ「Hello again from the updated Docker container!」が表示されます。
これにより、docker compose watch がコード変更時に自動的にビルドと再起動プロセスを処理する仕組みが確認できました。
docker compose watch を実行しているターミナルで Ctrl+C を押すと、プロセスを停止できます。
--no-up オプションを使用して初期ビルドなしで監視する
このステップでは、docker compose watch の --no-up オプションについて検証します。デフォルトでは、docker compose watch はファイル変更の監視を開始する前に docker-compose.yaml ファイルで定義されたサービスのビルドと起動を行います。--no-up オプションを使用すると、この初期ビルドと起動をスキップできます。これは、サービスをすぐに起動せずに変更監視を開始したい場合や、後で手動で起動する予定がある場合、あるいは既にサービスが実行中の場合に有用です。
まず、~/project/my-watch-app ディレクトリにいることを確認してください。
cd ~/project/my-watch-app
次に、--no-up オプションを付けて docker compose watch コマンドを実行します。
docker-compose watch --no-up
前のステップとは異なる出力が表示されます。Docker Compose はファイル変更の監視を開始しますが、初期状態ではイメージのビルドやコンテナの起動は行いません。出力には指定されたパスを監視中であることが表示されます。
docker compose watch --no-up がターミナルで実行されている状態で、別のターミナルまたはタブを開きます。新しいターミナルでプロジェクトディレクトリに移動します。
cd ~/project/my-watch-app
では、再度 app.py ファイルを変更してみましょう。
nano app.py
内容を以下のように変更します:
print("Watching without initial up!")
ファイルを保存して閉じます(Ctrl+X、Y、Enter)。
docker compose watch --no-up を実行しているターミナルに戻ると、変更が検知され、イメージがリビルドされていることが出力に表示されます。ただし、--no-up オプションを使用しているため、コンテナは自動的に再起動されません。
変更の効果を確認するには、リビルドが完了した後、別のターミナルで手動的にサービスを起動する必要があります。
docker-compose up
コンテナから新しいメッセージ「Watching without initial up!」が表示されます。
docker compose watch --no-up を実行しているターミナルで Ctrl+C を押すと、監視プロセスを停止できます。docker-compose up を実行しているターミナルで Ctrl+C を押すと、コンテナを停止できます。
--quiet オプションでビルド出力を非表示にする
このステップでは、docker compose watch の --quiet オプションの効果を確認します。デフォルトでは、docker compose watch が変更を検知してイメージをリビルドする際、ビルドプロセスの詳細な出力が表示されます。--quiet オプションを使用すると、この詳細なビルド出力が抑制され、監視プロセスとサービス再起動に関する重要な情報のみが表示されます。これは特に頻繁な小さな変更がある場合に、出力をクリーンに保つのに役立ちます。
まず、~/project/my-watch-app ディレクトリにいることを確認してください。
cd ~/project/my-watch-app
次に、--quiet オプションを付けて docker compose watch コマンドを実行します。初期サービスの起動に関連する出力ではなく、監視とリビルドプロセスに関連する出力のみを確認するため、--no-up オプションも再度含めます。
docker-compose watch --quiet --no-up
Docker Compose がファイル変更を監視していることを示す出力が表示されますが、最初は詳細なビルド出力は表示されません。
docker compose watch --quiet --no-up がターミナルで実行されている状態で、別のターミナルまたはタブを開きます。新しいターミナルでプロジェクトディレクトリに移動します。
cd ~/project/my-watch-app
では、最後にもう一度 app.py ファイルを変更してみましょう。
nano app.py
内容を以下のように変更します:
print("Quietly watching changes!")
ファイルを保存して閉じます(Ctrl+X、Y、Enter)。
docker compose watch --quiet --no-up を実行しているターミナルに戻ると、変更が検知され、イメージがリビルドされていることが示されますが、Docker ビルドプロセスの詳細なステップは非表示になります。リビルドに関する簡潔なメッセージのみが表示されます。
これにより、docker compose watch によってトリガーされるビルドフェーズ中に --quiet オプションが出力の冗長性をどのように低減するかが確認できます。
docker compose watch --quiet --no-up を実行しているターミナルで Ctrl+C を押すと、監視プロセスを停止できます。
まとめ
この実験では、ローカルファイルから Docker イメージをビルドするために必要な、ビルドコンテキストを含むシンプルな Docker Compose プロジェクトの準備方法を学びました。プロジェクトディレクトリの作成、基本的な Python アプリケーションファイル (app.py) の作成、アプリケーション用のイメージをビルドする Dockerfile、そしてサービスとそのビルドコンテキストを定義するdocker-compose.yamlファイルを作成しました。
さらに、docker compose watchコマンドについて検証しました。このコマンドを使用すると、ビルドコンテキスト内のファイル変更を自動的に監視し、関連するサービスのリビルドをトリガーできます。自動リビルドプロセスを観察する方法を学び、初期ビルドなしで監視する--no-upオプションや、ビルド出力を抑制する--quietオプションについても検証しました。これにより、開発ワークフローを効率化する方法を習得しました。



