Dockerfileの記述を考える(Django + MySQL②)


この記事について

この記事は、「Django + MySQLの環境構築を通じてDockerの使い方を学ぶ」に関連する記事群の Part.2 です。

  1. venvを利用してPythonの仮想環境を構築する
  2. Dockerfileの記述を考える ( 当記事 )
  3. docker-compose.ymlの記述を考える
  4. 設定ファイルを編集し docker-compose up を実行する
  5. 依存関係にあるサービス間のコンテナ立ち上げタイミングを調整する

はじめに

この記事では、Django向けのDockerイメージを作成するため、Dockerfileの記述について考えていきます。

Dockerイメージについては、( あくまで"頭の中のイメージ"としては ) ホストマシンとは独立したOSで動く、プロジェクトを動かすための小さな専用のマシンのようなものだと捉えています。

公式によって用意されているPythonのイメージを、Dockerfile内の記述を通してDjangoプロジェクト向けに設計します。記述そのものは公式ドキュメントに書いてあるものとほぼ同じ内容です。ここでは、今後必要に応じて設計・カスタマイズを行うことができるよう、その記述の意味を考えていきます。

なお、Dockerのインストール等はすでに済んでいるものとして進めていきます。

Dockerfile前回作成したプロジェクトのディレクトリの直下に作成します。

記述内容

先に、ファイル全体の記述としては、以下の通りです。

Dockerfile
FROM python:3.7
ENV PYTHONUNBUFFERED 1

RUN mkdir /code
WORKDIR /code

COPY requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

COPY . /code/

EXPOSE 8000

記述の意味を考える

上から順番に、

FROM python3.7

1行目、すでに作成されているイメージの中から、どのイメージを使うか、を指定します。前回の記事で作成した仮想環境に合わせて、ここではPython3.7を指定しています。

ENV PYTHONUNBUFFERED 1

2行目、ENVで環境変数を指定しています。環境変数PYTHONUNBUFFEREDの値を1にするということです。標準入出力に関するPythonのバッファリングを無効にするために設定しておきます。

RUN mkdir /code

飛んで4行目、RUN構築時に実行するコマンドを指定できます。ここでは、codeディレクトリを作成しています。

WORKDIR /code

5行目、ワークディレクトリを指定します。以後のRUNCMDを、どのディレクトリから実行するかの指定を行なっています。

COPY requirements.txt /code/

間を開けて7行目、前回作成したrequirements.txtcodeディレクトリ下にコピーします。ADDでも同じことができますが、用途の広さの関係などから、純粋なファイルのコピーにはCOPYが推奨されているようです。( 公式ドキュメント参照 )

RUN pip install --upgrade pip

8行目で、pipそのものをアップグレードしておき、

RUN pip install -r requirements.txt

9行目、先ほどコピーしたrequirements.txtに記述されているパッケージ群をインストールします。

COPY . /code/

11行目、これでホストPC ( Mac ) のプロジェクトルート ( Dockerfile が配置されている階層 )以下の全てのディレクトリ/ファイルが、後ほど生成されるコンテナへとコピーされます。

EXPOSE 8000

最後は、利用するポートの番号を宣言します。慣例上はライブラリ/フレームワークで使われている標準的な数字にすることが多いようなので、ここではDjangoでデフォルトの8000番を指定しています。( 別の数字の宣言も試しましたが、サーバー実行時のコマンドライン引数や後ほど作成するdocker-compose.yml内の記述と整合性を持たせれば動作に問題はなさそうでした。 )

現時点でのディレクトリ構成

django_starter
    ├── config
    │     ├── __init__.py
    │     ├── asgi.py
    │     ├── settings.py
    │     ├── urls.py
    │     └── wsgi.py
    ├── Dockerfile        <- New!
    ├── manage.py
    ├── .venv
    │   └── ()
    └── requirements.txt

終わりに

これで、Djangoの環境を作るためのDockerfileの記述は一区切りです。

続いて、今回作成したDockerfileを元にdocker-compose.ymlの記述について考えていきます。
次の記事はこちらから↓
「 3. docker-compose.ymlの記述を考える

ご覧いただきありがとうございました。