Пошаговое руководство по созданию контейнера Python

В этой статье вы узнаете, как создать файл Python Dockerfile. Мы расскажем достаточно, чтобы вы смогли начать свой собственный проект. Этот файл Dockerfile в настоящее время используется в двух моих любимых проектах. Один касается получения обложек книг из внешнего сервиса, а другой создает превью для моего блога.

Итак, мы рассмотрим Dockerfile строка за строкой и извлечем уроки из этого. Не волнуйтесь, предварительные знания вам не понадобятся. Я уверен, что к концу этой статьи вы сможете сделать это самостоятельно. В нынешней среде разработки программного обеспечения знание Docker является обязательным.

Слишком много проектов по науке о данных терпят неудачу просто из-за производственных проблем. Деловые люди часто недооценивают все, что связано с разработкой программного обеспечения. Вместо того, чтобы снова и снова доказывать концепцию, больше внимания следует уделять созданию ценного программного обеспечения. Прочитав эту статью, вы узнаете очень важную часть цикла разработки программного обеспечения. Эта статья посвящена используемому программному обеспечению.

Создать приложение

Итак, я предполагаю, что на этом этапе вы создали базовое приложение. Если вы этого не сделали, лучше всего реализовать базовый запрос GET с помощью FastAPI. Хороший пример можно найти в этом уроке. Это хорошее упражнение, так почему бы не попробовать его самому?

Поскольку наличие приложения имеет решающее значение для остальной части статьи, включен пример исходного кода основного приложения:

На этом этапе вы должны иметь возможность запустить приложение с помощью только следующей команды:

python "main.py"

С этого момента я подробно объясню каждую строку Dockerfile в следующем разделе. Если вам кажется, что вы чего-то не понимаете, не бойтесь спрашивать в комментариях ниже!

Создать Dockerfile

Первая строка файла Dockerfile, который мы собираемся создать, посвящена нашему языку. Поскольку мир все больше и больше знакомится с Python 3, неудивительно, что я выбрал одну из последних версий Python. Если вас интересуют другие доступные базовые образы Docker для Python, эта страница - ваш друг.

FROM python:3.8

Две следующие строки часто игнорируются, когда люди пишут или говорят о Docker. Тем не менее, на мой взгляд, они очень важны. Следующие строки гарантируют, что все, что вы делаете внутри контейнера, выполняется обычным пользователем. Вы ведь не используете sudo для каждой команды в Linux, верно? Эти строки не позволят вам испортить внутреннюю структуру образа Docker и избежать проблем с привилегиями в дальнейшем.

Следующие две строки добавляют группу user, пользователя с именем user и домашний каталог в каталоге /home/user:

RUN useradd -ms /bin/bash user
USER user

Поскольку мы ленивы, как хорошие разработчики, мы не хотим добавлять домашний каталог к ​​каждой команде, которую собираемся выполнить. Поэтому вместо этого мы используем следующую строку в нашем Dockerfile. Это гарантирует, что все, что мы делаем, мы делаем внутри домашнего каталога:

WORKDIR /home/user

Вне среды контейнера Docker рекомендуется работать с виртуальной средой. Я дам вам представление о том, как выглядит файл requirements.txt:

mockito~=1.2.2
requests~=2.24.0
Pillow~=7.2.0
pylint~=2.6.0
fastapi~=0.61.1
uvicorn~=0.11.8

Виртуальная среда очень полезна, когда вы работаете над несколькими проектами. Работая таким образом, вы предотвращаете переход на более раннюю или более раннюю версию пакетов, которые вы используете где-либо еще, которые могут нарушить работу вашего приложения, которое работало вчера вечером. Вы не хотите, чтобы это произошло, и руководитель вашей группы тоже не хочет этого слышать.

Итак, в этой строке мы копируем все необходимые библиотеки с вашего хост-компьютера в контейнер Docker:

COPY requirements.txt .

С помощью этого файла мы можем установить все необходимые библиотеки для нашего приложения. После этого нам больше не понадобится этот файл в контейнере Docker, так что не будем его там хранить.

Примечание. Вы можете подумать об этом, но я не считаю полезным создавать здесь второй уровень Docker.

RUN pip install -r requirements.txt && rm requirements.txt

Хорошо, а как насчет источника? Что ж, пришло время исходников. Мы скопируем это прямо сейчас.

Мне сложно угадать, куда вы поместили свои тестовые файлы, но вы не хотите, чтобы они были в вашем контейнере Docker. Помните об этом, если хотите оптимизировать свой контейнер. Для простоты эта часть опущена.

COPY src .

Вторая последняя строка предназначена для документации. Поскольку мы запускаем приложение на порту 10000, мы используем инструкцию expose, чтобы прояснить это. Таким образом, мы также знаем в производственной среде, какие порты доступны.

EXPOSE 10000

Последняя строка касается запуска приложения. Поскольку все о том, как запустить приложение, содержится в main.py, это довольно типично для других приложений. Таким образом, нам не придется так часто открывать Dockerfile.

ENTRYPOINT [ "python", "main.py"]

Вот и все - весь Dockerfile всего в несколько строк.

Итак, давайте создадим изображение с классным тегом, чтобы мы могли поделиться им с нашими коллегами:

docker image build . -t "awesome_tag"
...
Successfully built 41612ca5ccfd
Successfully tagged awesome_tag:latest

И теперь нам остается только раскрутить контейнер!

docker container run -t awesome_tag:latest -p 10000:10000
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:10000

И это буквально все, что нужно для запуска одного из ваших приложений Python в Docker. На этом этапе вы сможете сделать это самостоятельно для любого проекта.

Заключение

В этой статье мы увидели, как создать приложение Python и запустить его в контейнере Docker. Создать Dockerfile для небольшого приложения, такого как то, которое мы создали с помощью FastAPI, очень просто, поэтому я всегда рекомендую начинать с контейнеров как можно раньше.

Используя Docker, тестирование новых версий приложения становится намного проще, так как вы можете легко настроить его практически в любой среде - с установленным Docker. Если у вас остались вопросы, задавайте их в комментариях. Я буду более чем рад ответить на все вопросы.