2024年7月24日水曜日

docker compose watch を試す

docker compose watch を試す

概要

結論から述べると開発用の機能で sync はファイルの同期で rebuild はコンテナの再作成になります
それぞれ指定のファイルが更新されると発火する感じになっています

環境

  • Ubuntu 22.04
  • docker 27.0.3

アプリ作成

何でも OK です

  • pyenv local 3.11.6
  • pip install pipenv
  • pipenv install flask
  • vim app.py
from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
  print("hello")
  return "hello"

Dockerfile 作成

  • vim Dockerfile
FROM python:3.11.6-slim-bullseys

ADD . /app
WORKDIR /app

RUN pip install pipenv
RUN pipenv install
ENV FLASK_APP app.py

EXPOSE 5000

CMD ["pipenv", "run", "flask", "run", "--host", "0.0.0.0"]

compose.yaml

今回のポイントとなるファイルです

services:
  server:
    build:
      context: .
    develop:
      watch:
        - action: sync
          path: .
          target: /app/
        - action: rebuild
          path: ./rebuild_test.txt
    ports:
      - 5000:5000

develop -> watch -> action で発火するイベントを指定できます
sync がファイル同期で rebuild がコンテナ再作成になります
特定のファイルやディレクトリを指定することでそのファイルが更新された際に action を自動で実行してくれます

watch で起動する

up の代わりに watch を使います
なお -d オプションはないようです

  • docker compose watch

「Watch enabled」で起動すれば OK です

動作確認

sync

まずは sync を確認してみます
ワーキングディレクトリで新規でファイルを作成してみましょう

  • touch hoge

すると watch 側のログに「Syncing “server” after changes ware detected」と表示されるのが確認できます
試しに /app 配下を確認すると hoge ファイルがあるのが確認できます

  • docker compose exec server ls -l /app/hoge

rebuild

今回は rebuild_test.txt を変更するとコンテナの再作成が走ります

  • echo test > rebuild_test.txt

watch 側のログにコンテナが再作成されているのが確認できると思います

最後に

これまではホスト領域をマウントしてコンテナの再起動や再作成を手動で行っていましたがそれらを自動で行ってくれます
コンテナの再作成は Dockerfile に記載の内容を再度実行するので可能な限り軽量な処理を記載したほうが良いかなと思います

watch は Ctrl+c で抜けれます
なお watch 終了後はコンテナ自体は起動しているので down してあげましょう

なお rebuild でコンテナが再作成された場合は古いコンテナは自動で削除されるようです

参考サイト

0 件のコメント:

コメントを投稿