Dockerfileのコピーとcompose.yamlのマウント

きっかけ

Docker Compose + Flaskで開発をしようと思った時にDockerfileでイメージにコピーするファイル、compose.yamlでコンテナにマウントするファイルをどうするべきかしばらく悩んだ

ディレクトリ構成

Flaskアプリケーションに則って__init__.pyを作成、__init__.pyにアプリケーションファクトリを実装した
Application Setup — Flask Documentation (3.0.x) (palletsprojects.com)

project-root/        # プロジェクトルート
    app-name/        # アプリケーションディレクトリ
        __init__.py  # アプリケーションファクトリ実装
    docker/
        app/
            Dockerfile
    .gitignore
    README.md
    compose.yaml
    requirements.txt

起動コマンド

Flaskアプリケーションを起動するコマンドは以下

# アプリケーション起動
flask --app app-name run --debug

調査

Dockerfileを用いたイメージへのコピー、compose.yamlを用いたコンテナへのマウントは、基本的に以下のように考える

[ Dockerfileを用いたイメージへのコピー ]
永続的に持たせる情報のため機密情報を含ませない
イメージサイズを大きくし過ぎないために必要なファイルのみ

[ compose.yamlを用いたコンテナへのマウント ]
一時的に持たせる情報のためプロジェクトルートをマウント

ということで作成したDockerfileとcompose.yamlは以下の通り

# Dockerfile

FROM python:3.12.4-alipine

WORKDIR /app

COPY requirements.txt /app

RUN pip install --upgrade pip && pip install -r requirements.txt

COPY app-name /app/app-name

CMD ["flask", "--app", "booksh", "run", "--host=0.0.0.0"]
# compose.yaml

services:
  api:
    build:
      context: .  # ビルドコンテキストをプロジェクトルートに指定
      dockerfile: ./docker/app/Dockerfile
    volumes:
      - type: bind
        source: .
        target: /app
    ports:
      - "5000:5000"

※ ビルドコンテキスト
Dockerイメージのビルド時にDockerデーモンに渡されるファイルやディレクトリの集合
デフォルトではdocker buildを実行したカレントディレクトリのファイルやディレクトリがDockerデーモンに渡される
compose.yamlのcontextでビルドコンテキストを明示的に指定すると、指定したディレクトリでdocker buildが実行され、そのディレクトリに存在するファイルやディレクトリがビルドコンテキストとしてDockerデーモンに渡される

まとめ

とりあえず、Dockerfileを使って最低限のファイルをイメージへコピー、compose.yamlを使ってプロジェクトルートをコンテナにマウント、という感じで良さそう

いいなと思ったら応援しよう!