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
для сохранения ключей и пакетов между запусками. - Подпись пакетов: Для подписи пакетов и хранения их в существующем репозитории необходимо использовать именования ключей, соответствующих тем наименованиям, которые ранее имели ключи при подписи существующих пакетов в репозитории. Таким образом по умолчанию, если имя для генерации новых ключей не было указано - оно заимствует имя пользователя. Таким образом
имя пользователя
==имена ключей
.