В этом руководстве мы посмотрим, как установить пакет Python, хранящийся в частном репо, в документе Docker
Эта проблема
Допустим, у вас есть набор общих утилитов Python, который вы используете по ряду различных проектов.
Например, скажем, у вас есть несколько скриптов, которые генерируют случайные пользовательские данные с целью тестирования различных приложений, которые вы делитесь в нескольких проектах
Копирование этих сценариев в нескольких базах кода – это кошмар с точки зрения обслуживания, но эти утилиты могут содержать проприетарный код, который нельзя поставить где-то публично. Так где ты можешь их поставить?
Решение
Один вариант состоит в том, чтобы упаковать свои утилиты в пакет Python, храните пакет в частном репозитории Python, а затем иметь изображение Docker, которое содержит ваши проекты, установившие эти утилиты с вашего репозитория. Таким образом, вы можете легко контролировать версию этих утилит во всех проектах, которые имеют зависимость от них.
В этом уроке мы посмотрим, как создать пакет Python, надежно хранить его в частном репозитории (в этом случае, Packagr.app) и написать документ Docker, который аутентифицирует ваш частный репозиторий Python, затем тянет и устанавливает ваш пакет Отказ
Для хорошей меры мы также будем хранить наш построенный образ докера в Packagr.app
Практический пример
Для целей настоящего Учебника мы собираемся построить простой инструмент, который генерирует случайные пользовательские данные, которые мы можем использовать для заполнения API, выполнения тестов и т. Д. Ваши утилиты могут сделать что-то совершенно другое, но вы можете использовать тот же подход для создания распределенного пакета, чтобы делать все, что вам нужно, и хранить его в частном порядке.
Создание вашего проекта
Давайте начнем с создания нашего пакета. Это руководство предполагает, что у вас уже есть Python3.
и Виртуальский
установлены. Давайте создадим папку под названием Генератор данных
и виртуальная среда:
# create a directory and cd into it mkdir data-generator && cd data-generator # create a virtual environment, and activate it python3 -m venv env source env/bin/activate
Далее давайте создадим подкаталог под названием Пакет
что будет хранить наш код
mkdir package
Давайте установим Faka, среду Python, которая генерирует случайные данные
pip install Faker
И давайте создадим файл под названием Process.py
в Пакет
Папка, которая генерирует случайного пользователя каждый раз, когда она называется:
# process.py from faker import Faker import json fake = Faker() def generate_person(): print( json.dumps(dict( name=fake.name(), email=fake.email(), password=fake.password(), address=fake.address() )) )
Вышеуказанная функция просто выводит фиктивное лицо в формате JSON, что выглядит так:
{ "name": "Samuel Mendez", "email": "michelle71@hotmail.com", "password": "*hMRsQBbK1", "address": "78287 Morgan Summit\nPhillipsstad, WV 38051" }
Далее, давайте создадим папку под названием Bin
В корневом каталоге и добавьте файл под названием Человек
Отказ Это простой скрипт, который позволит вам позвонить вашу функцию из оболочки
#!/usr/bin/env python from package import process process.generate_person()
Наконец, давайте создадим файл под названием setup.py
В корне Генератор данных
каталог.
from setuptools import setup setup( name='data-generator', # the name of the package version='1.0', packages=['package'], # contains our actual code author='chris', author_email='chris@packagr.app', description='a random person generator', scripts=['bin/make-person'], # the launcher script install_requires=['faker==2.0.2'] # our external dependencies )
Наша структура папки теперь должна выглядеть что-то подобное:
/data-generator /package process.py /bin make-person setup.py
Теперь мы готовы построить наш пакет! Введите следующие строки в командную строку:
# install wheel (to build packages in the bdist_wheel format) pip install wheel # create the package python setup.py bdist_wheel
Процесс будет запущен, и будут созданы несколько дополнительных папок. Тот, который мы больше всего заинтересованы в том, это Dist
Папка, которая содержит наш построенный пакет:
/dist data_generator-1.0-py3-none-any.whl
Вы можете проверить, что наш пакет работает, как ожидается, установив и запуская его следующим образом:
# install the local package pip install dist/* # call the script make-person {"name": "Alexandra Nelson", "email": "sgarcia@yahoo.com", "password": "*c706Hvc+H", "address": "625 Powers Orchard\nNorth Bonnietown, IN 04475"}
Загрузка пакета в наш частный репозиторий
Теперь, когда мы построили пакет, мы можем загрузить его в наш частный репозиторий. Если у вас еще нет частного репозитория для загрузки, вы можете создать один бесплатно в Packagr.app следуя простому процессу регистрации. После того, как вы вошли в свою учетную запись, нажмите «Создать новый пакет» в меню «Левое ручное», чтобы увидеть URL-адрес вашего частного репозитория – обратите внимание на это, так как вам понадобится потом.
Теперь, когда у вас есть частный репозиторий и пакет, мы можем загружать файлы к нему. Мы делаем это, используя инструмент под названием шпагат
# install twine pip install twine # upload your built package to your repository (update the URL as necessary) twine upload --repository-url https://api.packagr.app/63cdQSDO/ dist/*
Вам будет предложено ввести учетные данные – просто используйте имя пользователя и пароль, с которыми вы зарегистрировались для Packagr с. Как только вы сделали это успешно, вы увидите ваш новый пакет в вашу пакет приборной панели.
Установка вашего частного пакета изнутри докерный контейнер
Теперь, когда наш пакет надежно хранится в нашем репозитории, давайте создадим докерный образ, способный установить его. Важно помнить, что вы должны Никогда не храните сырые учетные данные в вашем DockerFile или где-нибудь еще в вашем коде для этого. Итак, вы должны пройти свои учетные данные в качестве ведовых переменных при сборке. Имея в виду, давайте начнем с создания файла, называемых требованиями. Atxt в пустой папке, запомняя, чтобы изменить URL-адрес репозитория на свой собственный:
--extra-index-url https://api.packagr.app/63cdQSDO/ data-generator==1.0.0 faker==2.0.2
Файл требований – это просто список пакетов для установки PIP. В этом случае мы добавляем наш частный пакет, Генератор данных
и государственная зависимость, Faker
Отказ Добавление . --extra-index-url
говорит Пип, чтобы посмотреть в нашем частном репо, в дополнение к публичному Pypi.org One.
Далее, давайте создадим нашу DockerFile
FROM python:3.7-alpine ARG USER ARG PASS RUN echo "machine api.packagr.app \ " login ${USER} \ " password ${PASS}" > /root/.netrc RUN chown root ~/.netrc RUN chmod 0600 ~/.netrc COPY requirements.txt /requirements.txt RUN pip install -r requirements.txt CMD make-person
Давайте сделаем подробный взгляд на это, одна строка за раз:
Из Python: 3.7-Alpine
Рассказывает Docker базовое изображение для использования – в этом случае мы используем легкий альпийский питон диета, в основном, чтобы сэкономить время/пространствоПользователь Arg
иArg Pass
Определяет переменные, которые мы предоставим в строю время – в частности, наше имя пользователя и пароль PackagrЗапустить эхо ...
Создает файл, называемый .NETRC, который сообщает изображение в использовании пакета имени пользователя и пароль при подключении к API.Package.app. 2 следующие строки устанавливают разрешения этого файла правильноСкопируйте требования ...
копирует файл требований к изображению DockerБеги пип ...
Устанавливает зависимости в наших файлах требования.CMD Make-Person
Просто вызывает скрипт, определенный в нашем Setup.py во время выполнения
Теперь, когда у нас есть наш Dockerfile, давайте построим изображение докера, подставляя в своем пакете имени пользователя и пароль:
docker build -t dg-image --build-arg USER=chris@packagr.app --build-arg PASS=changeme .
Если все пойдет хорошо, ваше изображение Docker должно правильно строить! Теперь мы можем загрузить его в наш реестр Docker. Вернитесь к интерфейсу Backagr, нажмите на реестр Docker, и сделайте записку URL-адреса реестра Docker – оно должно быть похоже на URL REPO Phython Package, но с docker.packagr.app вместо домена, а с хэшем идентификатор в строчных буквах.
Первый шаг – войти в Docker – как обычно, вам нужно обновить URL, имя пользователя и пароль к своему собственному
docker login docker.packagr.app/63cdqsdo -u me@example.com -p changeme
Далее вам нужно пометить изображение, которое вы просто построете (снова, измените URL)
docker tag dg-image docker.packagr.app/63cdqsdo/dg-image:latest
Наконец, вы можете протолкнуть свои теги:
docker push docker.packagr.app/63cdqsdo/dg-image:latest
Вы не должны видеть ваше изображение в вашем документе Docker в пакете. Теперь вы можете вытащить это изображение Docker с любой другой машины, в которую вы вошли в систему с этой командой:
docker pull docker.packagr.app/63cdqsdo/dg-image:latest
Оригинал: “https://dev.to/christo22694524/installing-private-python-packages-in-docker-images-1hgm”