🐡

docker-compose.ymlとDockerfileのパスの関係について【初心者向けの記事】

2025/01/19に公開

パスの迷子になりました。
こんにちは、
ワニかず@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の中身

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の中身

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/

ということになります。

今回、条件の項目で示した通り

docker-compose.yml
context: ..

であるため、

Dockerfile
「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」は何処のこと?

docker-compose.yml
    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