Slide 1

Slide 1 text

Writing Dockerfile for a Python project the right way Serge Matveenko Twitter: @lig1 Github: @lig assaia.aero

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Straightforward (good) FROM python:3.7 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./your-daemon-or-script.py" ]

Slide 4

Slide 4 text

Straightforward (bad) FROM python:3 COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt WORKDIR /usr/src/app CMD python ./your-daemon-or-script.py

Slide 5

Slide 5 text

Caching (obvious) FROM python:3.7 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./your-daemon-or-script.py" ] FROM python:3 COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt WORKDIR /usr/src/app CMD python ./your-daemon-or-script.py

Slide 6

Slide 6 text

Caching (non-obvious) FROM python:3.7 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./your-daemon-or-script.py" ] FROM python:3 COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt WORKDIR /usr/src/app CMD python ./your-daemon-or-script.py

Slide 7

Slide 7 text

Python version FROM python:3.7 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./your-daemon-or-script.py" ] FROM python:3 COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt WORKDIR /usr/src/app CMD python ./your-daemon-or-script.py

Slide 8

Slide 8 text

Python version (even better) FROM python:3.7-stretch WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./your-daemon-or-script.py" ] FROM python:3 COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt WORKDIR /usr/src/app CMD python ./your-daemon-or-script.py

Slide 9

Slide 9 text

CMD FROM python:3.7 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "./your-daemon-or-script.py" ] FROM python:3 COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt WORKDIR /usr/src/app CMD python ./your-daemon-or-script.py

Slide 10

Slide 10 text

CMD (now you see me…) FROM python:3.7 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . ENTRYPOINT [ "python", "./your-daemon-or-script.py" ] CMD [ "run" ] FROM python:3 COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt WORKDIR /usr/src/app ENTRYPOINT python ./your-daemon-or-script.py CMD run

Slide 11

Slide 11 text

That was too easy

Slide 12

Slide 12 text

What if I want to build from …?

Slide 13

Slide 13 text

FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 # :) FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 RUN apt-get update && apt-get install -y lib… lib… ENV PYTHON_VERSION=3.6.6 RUN curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash && \ pyenv install ${PYTHON_VERSION} && \ pyenv global ${PYTHON_VERSION} && \ curl -L https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python && \ pipenv --python python COPY ./Pipfile ./Pipfile.lock ./ RUN pipenv install --deploy --dev

Slide 14

Slide 14 text

Two different Tensorflows??? FROM nvidia/cuda:9.0-cudnn7-runtime-ubuntu16.04 AS base COPY ./Pipfile ./Pipfile.lock ./ RUN pipenv install --deploy --dev CMD ["pipenv", "run", "python", "-m", "my.worker"] FROM base AS base-gpu RUN pipenv run pip install tensorflow-gpu==$(pipenv run pip show tensorflow | grep '^Version' | awk '{print $2}') FROM base as app COPY . . FROM base-gpu as gpu COPY . .

Slide 15

Slide 15 text

Questions? Serge Matveenko Twitter: @lig1 Github: @lig Telegram: @SergeMatveenko assaia.aero