Chapter 04

Dockerイメージの作成

smithonisan
smithonisan
2021.06.06に更新

前章でインストールした docker-compose を使って、Python環境の準備およびFastAPIのインストールを行う準備をします。

docker-compose関連ファイルの作成

適当な場所にプロジェクトディレクトリを作成し、プロジェクトディレクトリの直下に、以下の2ファイルを用意してください。

docker-compose.yaml
version: '3'
services:
  demo-app:
    build: .
    volumes:
      - .dockervenv:/src/.venv
      - .:/src
    ports:
      - 8000:8000  # ホストマシンのポート8000を、docker内のポート8000に接続する
Dockerfile
# python3.9のイメージをダウンロード
FROM python:3.9-buster
ENV PYTHONUNBUFFERED=1

WORKDIR /src

# pipを使ってpoetryをインストール
RUN pip install poetry

# poetryの定義ファイルをコピー (存在する場合)
COPY pyproject.toml* poetry.lock* ./

# poetryでライブラリをインストール (pyproject.tomlが既にある場合)
RUN poetry config virtualenvs.in-project true
RUN if [ -f pyproject.toml ]; then poetry install; fi

# uvicornのサーバーを立ち上げる
ENTRYPOINT ["poetry", "run", "uvicorn", "api.main:app", "--host", "0.0.0.0", "--reload"]

それぞれのファイルの役割を簡単に紹介しておきます。

ファイル名 役割
docker-compose.yaml docker-composeの定義ファイル。この中で、Dockerfileを呼び出して、Dockerコンテナのビルドを行います。
Dockerfile Dockerの定義ファイル。利用する公開イメージ(今回はPython 3.9がインストールされたOSイメージ)を取得し、 poetry (後述)によって、パッケージ定義ファイルである pyproject.toml を元に各pythonパッケージをインストールします。

イメージのビルド

以下のコマンドでDocker imageを作成します。

shell
$ docker-compose build

環境によりますが、以下のように出力されればimageの作成は成功です。

Building demo-app
[+] Building 1.0s (11/11) FINISHED
 => [internal] load build definition from Dockerfile
 => => transferring dockerfile: 37B
 => [internal] load .dockerignore
 => => transferring context: 2B
 => [internal] load metadata for docker.io/library/python:3.9-buster
 => [internal] load build context
 => => transferring context: 2B
 => [1/6] FROM docker.io/library/python:3.9-buster@sha256:6129e9019606e8a0c1ddfc5905f447440890441310c88fb3224f5fb1956ddea2
 => => resolve docker.io/library/python:3.9-buster@sha256:6129e9019606e8a0c1ddfc5905f447440890441310c88fb3224f5fb1956ddea2
 => CACHED [2/6] WORKDIR /src
 => CACHED [3/6] RUN pip install poetry
 => CACHED [4/6] COPY pyproject.toml* poetry.lock* ./
 => CACHED [5/6] RUN poetry config virtualenvs.in-project true
 => CACHED [6/6] RUN if [ -f pyproject.toml ]; then poetry install; fi
 => exporting to image
 => => exporting layers
 => => writing image sha256:5bc018bba96031e9b778f0705ec3226dbe7203ce056cf3afb56d83997f94a495 
 => => naming to docker.io/library/fastapi-book_demo-app