Создание контейнера Docker для развертывания приложения Python [закрыто]Linux

Ответить
Anonymous
 Создание контейнера Docker для развертывания приложения Python [закрыто]

Сообщение Anonymous »

Текущая проблема
Я пытаюсь создать приложение Python. Это непросто, поскольку Python не поддерживает способ создания одного скомпилированного двоичного файла из исходного кода. Более того, Python не поддерживает естественный способ создания разделяемых библиотек. Я объясню это более подробно в следующем разделе.
Python и общие библиотеки
Большинство языков предлагают относительно удобные способы создания кода. Обычно это включает в себя:
  • Создание нескольких общих библиотек, содержащих общий для проекта код.
  • Создание исполняемых файлов, использующих общие библиотеки (и, возможно, другие библиотеки)
Примеры:
  • В Java есть способ объединения кода в файл .jar. Существуют такие инструменты, как Maven и Gradle, которые помогают в процессе развертывания и объединения.
  • С помощью таких языков, как C++ и C, обычно создаются двоичные библиотеки и двоичные исполняемые файлы. Затем их можно будет развернуть. Существует способ связать двоичный исполняемый файл так, чтобы он содержал весь код общей библиотеки.
  • В Rust есть Cargo, который обычно создает отдельные двоичные исполняемые файлы, содержащие весь соответствующий код.
Python работает немного по-другому, поскольку процесс интерпретатора знает только текущий путь к рабочему каталогу и любые пути, которые были добавлены в переменную среды PYTHONPATH.
  • Изменение переменной среды PYTHONPATH обычно не рекомендуется, поскольку она плохо масштабируется и приводит к дополнительным накладным расходам на поддержание ее значения.
Это означает, что либо;
  • Исполняемые файлы Python должны представлять собой один файл, и в нем могут быть не должно быть общего кода между исполняемыми файлами
  • или любой общий код должен находиться в библиотеке, которая должна быть размещена в том же текущем рабочем каталоге, что и сами исполняемые файлы
Это предполагает такую ​​структуру проекта:

Код: Выделить всё

my-project/
bin/
executable1.py
executable2.py
...
lib1/
__init__.py
...
lib2/
__init__.py
...
Очевидно, что мы не создаем подобные проекты. Размещать весь код общей библиотеки в одном каталоге с исполняемыми файлами уже достаточно странно. Структура также нарушается, если мы хотим иметь общий код библиотеки и несколько каталогов в bin для разных «групп» исполняемых файлов. Например, невозможно создать в bin два подкаталога под названием group1 и group2 и использовать общий код Python в общей библиотеке, используемой обеими группами.
Вот почему я говорю, что Python не поддерживает общие библиотеки. Вы можете создать общую библиотеку, но для этого вам нужно использовать какой-то другой инструмент. (Если только вы не прибегнете к изменению PYTHONPATH. Предположим, мы не хотим этого делать.)
Решения проблем с общими библиотеками Python
На самом деле мы бы использовали такой инструмент, как virtualenv (venv) или Poetry (который, по сути, управляет виртуальными средами), чтобы позволить нам перенести код общей библиотеки в какой-то другой каталог и позволить интерпретатору Python найти его.
Моя текущая ситуация с рабочим процессом
До сих пор я использовал venv в интерактивном режиме для разработки программного обеспечения Python.
Это означает, что у меня такая структура проекта

Код: Выделить всё

my-project
.venv/...
bin/
...
src/
lib1/...
lib2/...
pyproject.toml
и я использовал venv в интерактивном режиме:

Код: Выделить всё

$ .venv/bin/activate
$ pip3 install -e .
Это отлично подходит для разработки, поскольку если код библиотеки в src будет изменен, эти изменения отобразятся «в реальном времени». (Это означает, что пакета нет, требуется этап установки. Просто запустите исполняемый файл, и «текущий» код будет использоваться.)
Это не очень хорошо для развертывания.
Почему Docker?
Мой первый подход к попытке «установить» готовую к использованию версию кода заключался в следующем:
  • Используйте systemd для управления процессами (запуском и остановкой)
  • Скопируйте исполняемый код из папки bin в какой-нибудь расположение «развертывания» в системе (например, /opt/my-project/bin/)
  • Создать колесо ()
  • Установить whl для всей системы
Я не получил что касается последних двух шагов, насколько я понял, это, вероятно, не очень хороший подход. С этим есть некоторые проблемы:
  • Смысл использования виртуальной среды заключался в том, чтобы избежать необходимости устанавливать пакеты с помощью pip во всей системе. Поэтому нет особого смысла создавать whl и устанавливать его для всей системы.
  • Я также не знаю, как бы я использовал виртуальную среду в этом контексте. . Я описал копирование исполняемых файлов Python в какой-то каталог, например /opt, который (очевидно) находится за пределами каталога «разработки», содержащего .venv.
  • Вся эта идея не имеет особого смысла
Это заставляет меня поверить, что использование Docker дает гораздо более разумный подход. Мы можем установить whl для всей системы внутри контейнера Docker.
  • Поразмыслив, я на самом деле не думаю, что существует разумный способ создания и развертывания кода Python без использования Docker. Если у кого-то есть какие-либо мысли по этому поводу, было бы здорово получить обратную связь.
Подход Docker и текущие проблемы
В настоящее время я не понимаю, как создать образ Docker и как установить в него файл whl.
Вот как, по моему мнению, должен работать этот процесс:
  • Создайте код общих библиотек Python в виде колеса
  • Создайте контейнер Docker, используя образ дистрибутива Python в качестве основы
  • Создайте контейнер Docker, используя в качестве основы образ дистрибутива Python
  • li>
    Скопируйте Wheel в контейнер Docker.
  • Установите Wheel в контейнер Docker.
  • Скопируйте оставшийся исполняемый код Python. в контейнер Docker (куда он должен идти?)
  • Установите точку входа контейнера по умолчанию в один из исполняемых файлов Python.
  • Есть затем дополнительные вопросы о «приятных дополнениях», например, добавлении в PATH или, возможно, переименовании исполняемого файла .py, чтобы он выглядел как обычный исполняемый файл... может быть?
Причина, по которой я запутался, заключается в том, что я использую Poetry для управления виртуальными средами процесса разработки (они не нужны в рабочем образе Docker) и не понимаю, как это сделать. выполните вышеуказанные шаги, поскольку в контейнере Docker не будет установлен venv или Poetry. Но я использую оба варианта для запуска своего кода в процессе разработки. (Вне контейнера Docker.)
Вот что у меня есть в pyproject.toml прямо сейчас:

Код: Выделить всё

[tool.poetry]
name = "docker-python-poetry-example"
version = "0.1.0"
description = ""
authors = ["Example "]
readme = "README.md"

[tool.poetry.scripts]
example-executable = 'bin.example_executable:main'

[tool.poetry.dependencies]
python = "^3.11"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Я в замешательстве, потому что не понимаю, где и когда мне следует использовать Poetry. Требуется ли в Docker-контейнере установка Poetry для установки колеса? Я не думаю, что это должно быть так.

Подробнее здесь: https://stackoverflow.com/questions/782 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»