Рубрики
Без рубрики

Установка частных пакетов Python в Docker Images

В этом руководстве мы посмотрим, как установить пакет Python, хранящийся в частном репо, в доке … Помечено с Python, Docker.

В этом руководстве мы посмотрим, как установить пакет 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”