docker-compose.ymlとDockerfileのパスの関係について【初心者向けの記事】
パスの迷子になりました。
こんにちは、
ワニかず@40歳 出戻りエンジニアです。
docker-compose.ymlを使って
Dockerコンテナを作る勉強をしていたのですが、
パスの指定が何処を指しているのか
混乱してしまいました。
そこで、今回は、
docker-compose.ymlのパスの記述と
Dockerfileのパスの関係などについてまとめました。
条件
VSCodeのコンテナの構成
CALENDAR_PROJECT/
├── .devcontainer/ # VS Code開発コンテナの設定
│ └── devcontainer.json
├── backend/ # Djangoプロジェクトのメインディレクトリ
│ ├── .vscode/ # VS Code設定
│ ├── config/ # Djangoプロジェクトの設定ファイル群
│ │ ├── __init__.py
│ │ ├── settings.py # Django設定
│ │ ├── urls.py # URLルーティング
│ │ └── wsgi.py # WSGIアプリケーション設定
│ ├── manage.py # Djangoの管理コマンド
│ └── requirements.txt # Pythonパッケージ依存関係
└── docker/ # Docker関連ファイル
├── docker-compose.yml
└── Dockerfile
docker-compose.ymlの中身
services:
web:
build:
context: ..
dockerfile: docker/Dockerfile
ports:
- "8001:8000"
volumes:
- ../backend:/app
command: python manage.py runserver 0.0.0.0:8000
depends_on:
- db
db:
image: postgres:13
environment:
- POSTGRES_DB=calendar_db
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- postgres_data:/var/lib/postgresql/data/
volumes:
postgres_data:
Dockerfileの中身
FROM python:3.9
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
RUN mkdir /static
RUN mkdir /app
WORKDIR /app
COPY backend/requirements.txt /app/
RUN pip install -r requirements.txt
「context: ..」は何処のこと?
「docker-compose.yml」の存在するディレクトリの上のフォルダ
「CALENDAR_PROJECT」のことになります。
「context: .」だと、「docker-compose.yml」の存在するディレクトリ、になるので、
「CALENDAR_PROJECT/docker/」
ということになります。
「docker-compose.yml」の「context:」の設定は
そもそも何かというと、
「Dockerfileのビルドコンテキスト」の設定になります。
なんのこっちゃ、さっぱりわからないですよね。
ですので、まずは「ビルドコンテキスト」について知る必要があります。
「ビルドコンテキスト」とは、
Dockerイメージをビルドする際に
「どのディレクトリ以下のファイルにアクセスできるようにするか」
を指定するものです。
ですので、
もし context: . とした場合:
ビルドコンテキスト = CALENDAR_PROJECT/docker/
context: .. とした場合:
ビルドコンテキスト = CALENDAR_PROJECT/
ということになります。
今回、条件の項目で示した通り
context: ..
であるため、
「COPY backend/requirements.txt /app/」
は、
「CALENDAR_PROJECT/」からの相対パスなので、
「CALENDAR_PROJECT/backend/requirements.txt」を
Dockerコンテナの「/app/」にコピーする
という意味になります。
「dockerfile: docker/Dockerfile」は何処のこと?
build: # ← このブロック内でのみ context: .. が有効
context: ..
dockerfile: docker/Dockerfile
となっているため、
「CALENDAR_PROJECT/」からの相対パスとなり、
「CALENDAR_PROJECT/docker/Dockerfile」が
dockerfileの場所、ということになります。
「volumes: - ../backend:/app」は何処のこと?
volumes:
- ../backend:/app
はdocker-compose.ymlファイルがある場所からの相対パスを示しています。
docker-compose.ymlの場所は:
CALENDAR_PROJECT/docker/docker-compose.yml
ですので、.. は1つ上の階層(CALENDAR_PROJECT/)に移動し、
そこからbackendディレクトリを参照しています。
つまり:
CALENDAR_PROJECT/docker/docker-compose.yml の位置から見て
../backend = CALENDAR_PROJECT/backend
を指しています。
よって、
volumes:
- ../backend:/app
という設定は、
ローカルのbackendディレクトリ(CALENDAR_PROJECT/backend)を
コンテナの/appディレクトリにマウント
という意味になります。
Discussion