Образ сборщика APK-файлов для Alpine Linux
Find a file
2025-05-02 21:16:46 +03:00
docker Обновление репозитория после внесения изменений в файл repositories 2025-05-02 21:16:46 +03:00
build.sh init 0.1.0 2025-04-29 04:01:20 +03:00
README.md init 0.1.0 2025-04-29 04:01:20 +03:00

apk-builder

Образ предназначен для автоматизации настройки окружения для сборки пакетов в Alpine Linux. Он создаёт пользователя, настраивает права, подключает NFS-сервер (если указан), управляет ключами для подписи пакетов и выполняет сборку пакетов с помощью утилиты abuild.

Сборка образа

Скрипт build.sh предназначен для автоматизации сборки и, при необходимости, отправки Docker-образов в указанный registry. Скрипт поддерживает настройку имени образа, версии, базового образа, выбор Dockerfile, а также указание дополнительных репозиториев и параметров registry.

Использование:

Скрипт запускается с обязательными и опциональными аргументами. Общий синтаксис:

./build.sh -n <имя> -v <версия> -b <версия_базового_образа> [-R <репозитории>] [-o] [-r <адрес_registry>] [-p <порт>] [-h]

Опции:

  • -n, --name (обязательно): Имя собираемого образа.
  • -v, --version (обязательно): Версия собираемого образа в формате X.Y.Z.
  • -b, --base-image-version (обязательно): Версия базового образа Alpine Linux.
  • -R, --repositories: Список репозиториев через точку с запятой для использования в Docker образе.
  • -o, --old: Использовать метод сборки для устаревшей версии Docker.
  • -r, --push-to-registry: Адрес registry для отправки образов.
  • -p, --port: Порт registry.
  • -h, --help: Показать справку.

Примеры сборки образа:

  1. Простая сборка образа без отправки в registry:

    ./build.sh -n my-app -v 1.0.0 -b 3.21
    
    • Скрипт соберет образ my-app:1.0.0 на основе базового образа Alpine Linux версии 3.21.
  2. Сборка с использованием метода сборки для устаревшей версии Docker:

    ./build.sh -n my-app -v 1.0.0 -b 3.21 -o
    
    • Скрипт соберет образ my-app:1.0.0 на основе базового образа Alpine Linux версии 3.21.
  3. Сборка и отправка в registry:

    ./build.sh -n my-app -v 1.0.0 -b 3.21 -r registry.example.com -p 5000
    
    • Скрипт соберет образ my-app:1.0.0.
    • Создаст теги: registry.example.com:5000/my-app:latest, registry.example.com:5000/my-app:1.0.0, registry.example.com:5000/my-app:1.0, registry.example.com:5000/my-app:1.
    • Отправит все теги в registry по адресу registry.example.com:5000.
  4. Сборка с дополнительными репозиториями:

    ./build.sh -n my-app -v 1.0.0 -b 3.21 -R "https://mirror.yandex.ru/mirrors/alpine/v3.21/main;https://mirror.yandex.ru/mirrors/alpine/v3.21/community"
    
    • Скрипт соберет образ my-app:1.0.0 на основе базового образа Alpine Linux версии 3.21 с использованием списка переданных репозиториев.

Использование образа

Для запуска контейнера используйте команду docker run с необходимыми параметрами и монтированием директорий. Пример команды:

docker run -it --rm \
  --privileged \
  -v /path/to/source:/source \
  -v /path/to/repository:/repository \
  -e BUILDER_USER="myuser" \
  -e REPOSITORY_LIST="https://mirror.yandex.ru/mirrors/alpine/v3.18/main;https://mirror.yandex.ru/mirrors/alpine/v3.18/community" \
  -e NFS_SERVER="192.168.1.100" \
  -e NFS_PORT="2049" \
  -e NFS_PATH="/nfs/repository" \
  -e REPOSITORY_NAME_DIR="myrepo" \
  -e NAME_KEY="mykey" \
  -e PUBLIC_KEY="$(cat /path/to/mykey.rsa.pub)" \
  -e PRIVATE_KEY="$(cat /path/to/mykey.rsa)" \
  my-app:1.0.0

Параметры запуска

Вы можете передать следующие параметры через переменные окружения (-e) или аргументы командной строки:

Параметр Описание По умолчанию Формат
BUILDER_USER Имя пользователя для сборки builder Строка (буквы, цифры, _, -)
REPOSITORY_DIR Директория для хранения собранных пакетов /repository Путь в контейнере
KEYS_DIR Директория для хранения ключей /keys Путь в контейнере
SOURCE_DIR Директория с исходными файлами (APKBUILD) /source Путь в контейнере
REPOSITORY_LIST Список репозиториев, разделённых ; Пусто Например: http://url1;http://url2
REPOSITORY_NAME_DIR Имя поддиректории для репозитория Версия Alpine (например, v3.18) Строка (буквы, цифры, _, -)
NFS_SERVER Адрес NFS-сервера Пусто IP-адрес или доменное имя
NFS_PORT Порт NFS-сервера 5000 Число от 1 до 65535
NFS_PATH Путь на NFS-сервере Пусто Путь, начинающийся с /
NAME_KEY Имя ключа для подписи Имя пользователя Строка (буквы, цифры, _, -)
PUBLIC_KEY Публичный RSA-ключ Пусто Формат BEGIN PUBLIC KEY
PRIVATE_KEY Приватный RSA-ключ Пусто Формат BEGIN RSA PRIVATE KEY

Монтирование директорий

  • -v /path/to/source:/source: Локальная директория с файлами APKBUILD и другими исходниками.
  • -v /path/to/repository:/repository: Локальная директория для хранения собранных пакетов.
  • -v /path/to/keys:/keys: Локальная директория для хранения ключей (если используются).

Что происходит при запуске

  1. Создание пользователя:

    • Создаётся пользователь с именем <BUILDER_USER> и добавляется в группу abuild.
    • Настраиваются права sudo для этого пользователя.
  2. Создание директорий:

    • Создаются директории: /home/<BUILDER_USER>/package, /keys, /source, /repository.
    • Все директории принадлежат пользователю <BUILDER_USER>.
  3. Настройка NFS (если указан):

    • Монтируется NFS-сервер (NFS_SERVER:NFS_PATH) в /repository на указанном порту (NFS_PORT).
    • Проверяется корректность адреса, порта и пути.
  4. Настройка репозиториев:

    • Если указан REPOSITORY_LIST, он записывается в /etc/apk/repositories.
  5. Настройка ключей для подписи:

    • Если переданы PUBLIC_KEY и PRIVATE_KEY:
      • Ключи сохраняются в /keys/<NAME_KEY>.rsa (приватный) и /keys/<NAME_KEY>.rsa.pub (публичный).
      • Настраивается файл /home/<BUILDER_USER>/.abuild/abuild.conf с указанием приватного ключа.
      • Публичный ключ копируется в /etc/apk/keys.
    • Если ключи не переданы, но существуют в /keys/<NAME_KEY>.rsa и /keys/<NAME_KEY>.rsa.pub:
      • Используются существующие ключи.
    • Если ключи отсутствуют:
      • Генерируются новые ключи с помощью abuild-keygen.
  6. Сборка пакета:

    • Исходные файлы из /source копируются в /home/<BUILDER_USER>/package.
    • Выполняется команда abuild -r для сборки пакета.
    • Собранные пакеты сохраняются в /repository/<REPOSITORY_NAME_DIR>.

Примеры сборки пакета

1. Минимальный запуск (без NFS и ключей)

Сборка пакета с использованием стандартных репозиториев и автоматической генерации ключей (без сохранения ключей):

docker run -it --rm \
  -v /path/to/source:/source \
  -v /path/to/repository:/repository \
  -e BUILDER_USER="builder" \
  -e REPOSITORY_LIST="https://mirror.yandex.ru/mirrors/alpine/v3.18/main;https://mirror.yandex.ru/mirrors/alpine/v3.18/community" \
  my-app:1.0.0

2. Запуск с NFS и пользовательскими ключами

Сборка пакета с монтированием NFS и использованием собственных ключей:

docker run -it --rm \
  --privileged \
  -v /path/to/source:/source \
  -e BUILDER_USER="myuser" \
  -e NFS_SERVER="192.168.1.100" \
  -e NFS_PORT="2049" \
  -e NFS_PATH="/nfs/repository" \
  -e REPOSITORY_NAME_DIR="myrepo" \
  -e NAME_KEY="mykey" \
  -e PUBLIC_KEY="$(cat /path/to/mykey.rsa.pub)" \
  -e PRIVATE_KEY="$(cat /path/to/mykey.rsa)" \
  my-app:1.0.0

3. Запуск с пользовательскими ключами

Сборка пакета с использованием собственных ключей:

docker run -it --rm \
  -v /path/to/source:/source \
  -v /path/to/keys:/keys \
  -v /path/to/repository:/repository \
  -e BUILDER_USER="myuser" \
  my-app:1.0.0

Дополнительно

  • Сохранение ключей: Если вы генерируете ключи внутри контейнера, сохраните их из директории /keys для повторного использования.
  • Повторное использование контейнера: Используйте одну и ту же директорию /keys и /repository для сохранения ключей и пакетов между запусками.
  • Подпись пакетов: Для подписи пакетов и хранения их в существующем репозитории необходимо использовать именования ключей, соответствующих тем наименованиям, которые ранее имели ключи при подписи существующих пакетов в репозитории. Таким образом по умолчанию, если имя для генерации новых ключей не было указано - оно заимствует имя пользователя. Таким образом имя пользователя == имена ключей.