apk-builder/README.md
2025-04-29 04:01:20 +03:00

187 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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