# apk-builder Образ предназначен для автоматизации настройки окружения для сборки пакетов в Alpine Linux. Он создаёт пользователя, настраивает права, подключает NFS-сервер (если указан), управляет ключами для подписи пакетов и выполняет сборку пакетов с помощью утилиты abuild. - [Сборка образа](#сборка-образа) - [Использование](#использование) - [Опции](#опции) - [Примеры сборки образа](#примеры-сборки-образа) - [Использование образа](#использование-образа) - [Параметры запуска](#параметры-запуска) - [Монтирование директорий](#монтирование-директорий) - [Что происходит при запуске](#что-происходит-при-запуске) - [Примеры сборки пакета](#примеры-сборки-пакета) - [Дополнительно](#дополнительно) ## Сборка образа Скрипт `build.sh` предназначен для автоматизации сборки и, при необходимости, отправки Docker-образов в указанный registry. Скрипт поддерживает настройку имени образа, версии, базового образа, выбор Dockerfile, а также указание дополнительных репозиториев и параметров registry. ### Использование: Скрипт запускается с обязательными и опциональными аргументами. Общий синтаксис: ```bash ./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**: ```bash ./build.sh -n my-app -v 1.0.0 -b 3.21 ``` - Скрипт соберет образ `my-app:1.0.0` на основе базового образа Alpine Linux версии `3.21`. 2. **Сборка с использованием метода сборки для устаревшей версии Docker**: ```bash ./build.sh -n my-app -v 1.0.0 -b 3.21 -o ``` - Скрипт соберет образ `my-app:1.0.0` на основе базового образа Alpine Linux версии `3.21`. 3. **Сборка и отправка в registry**: ```bash ./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. **Сборка с дополнительными репозиториями**: ```bash ./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` с необходимыми параметрами и монтированием директорий. Пример команды: ```bash 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. **Создание пользователя**: - Создаётся пользователь с именем `` и добавляется в группу `abuild`. - Настраиваются права `sudo` для этого пользователя. 2. **Создание директорий**: - Создаются директории: `/home//package`, `/keys`, `/source`, `/repository`. - Все директории принадлежат пользователю ``. 3. **Настройка NFS (если указан)**: - Монтируется NFS-сервер (`NFS_SERVER:NFS_PATH`) в `/repository` на указанном порту (`NFS_PORT`). - Проверяется корректность адреса, порта и пути. 4. **Настройка репозиториев**: - Если указан `REPOSITORY_LIST`, он записывается в `/etc/apk/repositories`. 5. **Настройка ключей для подписи**: - Если переданы `PUBLIC_KEY` и `PRIVATE_KEY`: - Ключи сохраняются в `/keys/.rsa` (приватный) и `/keys/.rsa.pub` (публичный). - Настраивается файл `/home//.abuild/abuild.conf` с указанием приватного ключа. - Публичный ключ копируется в `/etc/apk/keys`. - Если ключи не переданы, но существуют в `/keys/.rsa` и `/keys/.rsa.pub`: - Используются существующие ключи. - Если ключи отсутствуют: - Генерируются новые ключи с помощью `abuild-keygen`. 6. **Сборка пакета**: - Исходные файлы из `/source` копируются в `/home//package`. - Выполняется команда `abuild -r` для сборки пакета. - Собранные пакеты сохраняются в `/repository/`. ### Примеры сборки пакета #### 1. Минимальный запуск (без NFS и ключей) Сборка пакета с использованием стандартных репозиториев и автоматической генерации ключей (без сохранения ключей): ```bash 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 и использованием собственных ключей: ```bash 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. Запуск с пользовательскими ключами Сборка пакета с использованием собственных ключей: ```bash 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` для сохранения ключей и пакетов между запусками. - **Подпись пакетов**: Для подписи пакетов и хранения их в существующем репозитории необходимо использовать именования ключей, соответствующих тем наименованиям, которые ранее имели ключи при подписи существующих пакетов в репозитории. Таким образом по умолчанию, если имя для генерации новых ключей не было указано - оно заимствует имя пользователя. Таким образом `имя пользователя` == `имена ключей`.