| docker | ||
| build.sh | ||
| README.md | ||
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: Показать справку.
Примеры сборки образа:
- 
Простая сборка образа без отправки в registry:
./build.sh -n my-app -v 1.0.0 -b 3.21- Скрипт соберет образ 
my-app:1.0.0на основе базового образа Alpine Linux версии3.21. 
 - Скрипт соберет образ 
 - 
Сборка с использованием метода сборки для устаревшей версии Docker:
./build.sh -n my-app -v 1.0.0 -b 3.21 -o- Скрипт соберет образ 
my-app:1.0.0на основе базового образа Alpine Linux версии3.21. 
 - Скрипт соберет образ 
 - 
Сборка и отправка в 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. 
 - Скрипт соберет образ 
 - 
Сборка с дополнительными репозиториями:
./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: Локальная директория для хранения ключей (если используются).
Что происходит при запуске
- 
Создание пользователя:
- Создаётся пользователь с именем 
<BUILDER_USER>и добавляется в группуabuild. - Настраиваются права 
sudoдля этого пользователя. 
 - Создаётся пользователь с именем 
 - 
Создание директорий:
- Создаются директории: 
/home/<BUILDER_USER>/package,/keys,/source,/repository. - Все директории принадлежат пользователю 
<BUILDER_USER>. 
 - Создаются директории: 
 - 
Настройка NFS (если указан):
- Монтируется NFS-сервер (
NFS_SERVER:NFS_PATH) в/repositoryна указанном порту (NFS_PORT). - Проверяется корректность адреса, порта и пути.
 
 - Монтируется NFS-сервер (
 - 
Настройка репозиториев:
- Если указан 
REPOSITORY_LIST, он записывается в/etc/apk/repositories. 
 - Если указан 
 - 
Настройка ключей для подписи:
- Если переданы 
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. 
 - Генерируются новые ключи с помощью 
 
 - Если переданы 
 - 
Сборка пакета:
- Исходные файлы из 
/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для сохранения ключей и пакетов между запусками. - Подпись пакетов: Для подписи пакетов и хранения их в существующем репозитории необходимо использовать именования ключей, соответствующих тем наименованиям, которые ранее имели ключи при подписи существующих пакетов в репозитории. Таким образом по умолчанию, если имя для генерации новых ключей не было указано - оно заимствует имя пользователя. Таким образом 
имя пользователя==имена ключей.