poetry等でdockerfile作る
目的に応じて書くべき内容が変わる
サクッと機械学習の動作化環境用意する
devとprod環境を想定したマルチステージビルド
一般的pythonの開発
機械学習の環境
サクッと動かしたいだけなら、devとprodを分けるのは助長なのでこういう場合分けで考えるといいだろう
キャッシュ消すあたりの話はマルチステージビルドでprod側のステージで考えればいいと思う
しかし、venvを作成するとpoetryのプロジェクト名を含んだvenvのディレクトリが作成される。今回のDockerfileの構成上、これはdocker build時に作成されるので、イメージが出来た時点でvenvのパスがpoetry_templateに固定されてしまう。
code:Dockerfile
FROM python:3.6.6-alpine3.7
ARG YOUR_ENV
ENV YOUR_ENV=${YOUR_ENV} \
PYTHONFAULTHANDLER=1 \
PYTHONUNBUFFERED=1 \
PYTHONHASHSEED=random \
PIP_NO_CACHE_DIR=off \
PIP_DISABLE_PIP_VERSION_CHECK=on \
PIP_DEFAULT_TIMEOUT=100 \
POETRY_VERSION=1.0.0
# System deps:
RUN pip install "poetry==$POETRY_VERSION"
# Copy only requirements to cache them in docker layer
WORKDIR /code
COPY poetry.lock pyproject.toml /code/
# Project initialization:
RUN poetry config virtualenvs.create false \
&& poetry install $(test "$YOUR_ENV" == production && echo "--no-dev") --no-interaction --no-ansi
# Creating folders, and files for a project:
COPY . /code
poetryを公式urlからのやつでやると
バージョンが固定できない
なのでpip install 'poetry==$POETRY_VERSION'の方法を勧めている
サクッと動かす分ためならバージョンしていなくてもいいか
ビルド時のみの依存とかを分けられる
code:Dockerfile
FROM python:3.7.6-alpine3.11 as base
ENV PYTHONFAULTHANDLER=1 \
PYTHONHASHSEED=random \
PYTHONUNBUFFERED=1
WORKDIR /app
FROM base as builder
ENV PIP_DEFAULT_TIMEOUT=100 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1 \
POETRY_VERSION=1.0.5
RUN apk add --no-cache gcc libffi-dev musl-dev postgresql-dev
RUN pip install "poetry==$POETRY_VERSION"
RUN python -m venv /venv
COPY pyproject.toml poetry.lock ./
RUN poetry export -f requirements.txt | /venv/bin/pip install -r /dev/stdin
COPY . .
RUN poetry build && /venv/bin/pip install dist/*.whl
FROM base as final
RUN apk add --no-cache libffi libpq
COPY --from=builder /venv /venv
COPY docker-entrypoint.sh wsgi.py ./