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を使ってプロジェクトルートをコンテナにマウント、という感じで良さそう