init 0.1.0
This commit is contained in:
parent
72901d7978
commit
99c924f609
8 changed files with 584 additions and 279 deletions
186
README.md
186
README.md
|
@ -1,3 +1,187 @@
|
|||
# apk-builder
|
||||
|
||||
Образ сборщика APK-файлов для Alpine Linux.
|
||||
Образ предназначен для автоматизации настройки окружения для сборки пакетов в 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` для сохранения ключей и пакетов между запусками.
|
||||
- **Подпись пакетов**: Для подписи пакетов и хранения их в существующем репозитории необходимо использовать именования ключей, соответствующих тем наименованиям, которые ранее имели ключи при подписи существующих пакетов в репозитории. Таким образом по умолчанию, если имя для генерации новых ключей не было указано - оно заимствует имя пользователя. Таким образом `имя пользователя` == `имена ключей`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue