Docker、Djangoの環境構築はよく使うので自分用にメモ。
何かあればコメントください。
##結論
下記Dockerfile、requirements.txtを作成する。
#pythonのバージョン3.7-alpineイメージを使用する
FROM python:3.7-alpine
#プロジェクトの管理者が誰かを記載する。
LABEL maintainer = "samplejp<sample.com>"
#標準出力に出力されるバッファを無効化する('1'じゃなくてもいい)
ENV PYTHONBUFFERED 1
#ソース側のマシンにあるrequirements.txtをImage側のマシンへコピーする。
COPY ./requirements.txt /requirements.txt
#pipコマンドを最新にし、requirements.txtファイル内のパッケージをpipインストールする。
RUN pip install --upgrade pip && pip install -r /requirements.txt
# appディレクトリを作成しappディレクトリに移動。
# ソース側のマシンにあるappフォルダをImage側のマシンへコピーする。
RUN mkdir /app
WORKDIR /app
COPY ./app /app
# "user"ユーザーを作成する。
RUN adduser -D user
# 以降のコマンドの実行者を"root"から"user"ユーザーに変更する。
USER user
# Django3.1
Django==3.1
# 他にインストールしたいものがあればここに記載する。
# 例:pythonでMySQLに接続するためのドライバ
mysqlclient
##解説
FROM python:3.7-alpine
pythonのバージョン3.7-alpineイメージを指定。
もしNumpyやscikit-learnを使いたい場合はalpineよりslimの方が適している。
他のLinuxディストリビューションについてはこちらを参照
https://www.ted027.com/post/docker-debian-difference/
MAINTAINER Aquariummer App Developer Ltd
プロジェクトの管理者が誰かを記載する。オプショナルなので、なくても動作するがあったほうが良い。
[2021/12/18追記]docker 1.13以降はMAINTAINERではなくLABELを使用したほうが良いとのこと。
LABEL maintainer = "samplejp <sample.com>"
COPY ./requirements.txt /requirements.txt
ソース側のマシンにあるrequirements.txtをImage側のマシンへコピーする。
ADDではなくCOPYを使用する理由
RUN pip install --upgrade pip && pip install -r /requirements.txt
pipコマンドを最新にし、requirements.txtファイル内のパッケージをpipインストールする。
pipコマンドを最新化する理由はパッケージ管理で生じるエラーのリスクを軽減するため。
RUN adduser -D user
"user"ユーザーを作成する。
ユーザー名はなんでも良い。
root権限で作業すると外部からファイルが閲覧可能な状態となる。
セキュリティ的によろしくないので一般ユーザーを作成し、場合によっては別途権限を付与する。
useraddコマンドを使用する場合は-mが必須
例:RUN useradd -m ${USER}
adduserとuseraddの違いはこちら
https://qiita.com/amedama/items/f45677cd944c42cde839
一言で言うとadduserは対話的、useraddは独話的。自動で立ち上げたいファイルは独和的にやったほうが楽なのでuseraddを使用したほうが楽。
USER user
コマンドの実行者を"root"から"user"ユーザーに変更する。