Реалізація середовища пакування для Alpine Linux (презентація alpkg)

Нещодавно я зацікавився Alpine Linux і подумав, що було б добре зберегти деякі пакети Rust у їхніх сховищах. У цій статті я поділюся своїми нотатками/пригодами щодо налаштування середовища пакування та інструменту під назвою «alpkg» для автоматизації цього процесу.

mountain-view

Мій перший інтерес до Alpine Linux почався, коли я почав контейнеризувати свої проекти з відкритим кодом за допомогою легких контейнерів Alpine. Мені особливо подобається дотримуватися цього підходу для додатків Rust, оскільки розмір традиційних (glibc) дистрибутивних контейнерів, таких як Debian/Ubuntu, може досягати 200-300 МБ через роздутість, тоді як контейнери Alpine (musl) можуть залишатися такими. мінімальний, наприклад лише 3 МБ!

Ось приклад файлу Docker від rustypaste, який створює зображення розміром 3 МБ під час створення/стиснення:

Rust DE: 1.67.0-alpine3.17 як конструктор РОБОЧИЙ КАТАЛОГ / додаток Запустіть оновлення apk ЗАПУСТИТИ apk add --no-cache musl-dev КОПІЮВАТИ. . ЗАПУСТИТИ cargo build --locked --release ЗАПУСТИТИ mkdir -p build-out/ ЗАПУСТИТИ cp target/release/rustypaste build-out/ з нуля РОБОЧИЙ КАТАЛОГ / додаток КОПІЮВАТИ --from=builder /app/build-out/rustypaste . НАДІСЛАТИ СЕРВЕР__АДРЕСА=0.0.0.0:8000 EXPOSE 8000 КОРИСТУВАЧ 1000:1000 CMD ["./rustypaste"]

Тут слід зауважити одну річ: я особливо обираю скретч-зображення як бігун, оскільки воно надзвичайно мінімальне. Ви також можете отримати подібні результати за допомогою таких зображень, як distroless.

Хоч іноді вам потрібно компілювати за допомогою musl, воно того варте, коли результат настільки задовольняє. Інші речі, які відрізняються від Alpine:

glibc ➔ мюсл systemd ➔ OpenRC GNU Core Utilities ➔ BusyBox

Щоб дізнатися більше про Alpine, перегляньте цю статтю, у якій докладно пояснюється, чому це добре.

Тепер давайте поговоримо про налаштування середовища пакування для Alpine Linux.

В поле зору

У моєму конкретному випадку я хотів би продовжувати використовувати свою систему Arch Linux, а також пакет для Alpine Linux. Для цього у вас є кілька варіантів:

Запустіть Alpine Linux на віртуальній машині Запустіть Alpine Linux у chroot Використовуйте контейнер Docker/Podman із постійним сховищем

Я негайно виключив перший варіант, оскільки не хотів турбуватися про програмне забезпечення віртуальної машини та вважав, що це додатково ускладнить моє налаштування.

Потім я запустив контейнер Docker, який запускає Alpine, і спробував зробити сховище постійним. Після того, як я натрапив на цю публікацію StackOverflow, виявилося, що це щось складніше, ніж очікувалося, і я почав відчувати, ніби я винаходжу віртуальні машини заново через усі ці прив’язки та дозволи монтування. Не дивно, що я також відмовився від цієї ідеї.

Пізніше я натрапив на чудову статтю на Alpine Wiki про створення chroot:

У середовищі chroot ви можете створювати, налагоджувати та запускати пакети Alpine або розробляти речі. Це найвідоміший спосіб зробити це без заміни системи чи використання віртуальної машини.

Саме те, що мені потрібно!

Вирішивши, що використовувати, я придумав план і придумав таку схему:

Давайте розберемо це:

Все працює під Arch Linux. Є контейнер chroot, який містить необхідні пакети та інструменти Alpine SDK. В Alpine пакети — це сценарії APKBUILD, які містять інструкції зі збирання для інструменту збирання. Є репозиторій Git, налаштований поза chroot для додавання/оновлення/видалення пакетів. Щоб взаємодіяти зі сховищами, ми можемо просто надіслати патч (тобто запит на злиття) до сховищ aports, які знаходяться на gitlab.alpinelinux.org/alpine/aports. Все, що нам потрібно зробити, це створити...

Реалізація середовища пакування для Alpine Linux (презентація alpkg)

Нещодавно я зацікавився Alpine Linux і подумав, що було б добре зберегти деякі пакети Rust у їхніх сховищах. У цій статті я поділюся своїми нотатками/пригодами щодо налаштування середовища пакування та інструменту під назвою «alpkg» для автоматизації цього процесу.

mountain-view

Мій перший інтерес до Alpine Linux почався, коли я почав контейнеризувати свої проекти з відкритим кодом за допомогою легких контейнерів Alpine. Мені особливо подобається дотримуватися цього підходу для додатків Rust, оскільки розмір традиційних (glibc) дистрибутивних контейнерів, таких як Debian/Ubuntu, може досягати 200-300 МБ через роздутість, тоді як контейнери Alpine (musl) можуть залишатися такими. мінімальний, наприклад лише 3 МБ!

Ось приклад файлу Docker від rustypaste, який створює зображення розміром 3 МБ під час створення/стиснення:

Rust DE: 1.67.0-alpine3.17 як конструктор РОБОЧИЙ КАТАЛОГ / додаток Запустіть оновлення apk ЗАПУСТИТИ apk add --no-cache musl-dev КОПІЮВАТИ. . ЗАПУСТИТИ cargo build --locked --release ЗАПУСТИТИ mkdir -p build-out/ ЗАПУСТИТИ cp target/release/rustypaste build-out/ з нуля РОБОЧИЙ КАТАЛОГ / додаток КОПІЮВАТИ --from=builder /app/build-out/rustypaste . НАДІСЛАТИ СЕРВЕР__АДРЕСА=0.0.0.0:8000 EXPOSE 8000 КОРИСТУВАЧ 1000:1000 CMD ["./rustypaste"]

Тут слід зауважити одну річ: я особливо обираю скретч-зображення як бігун, оскільки воно надзвичайно мінімальне. Ви також можете отримати подібні результати за допомогою таких зображень, як distroless.

Хоч іноді вам потрібно компілювати за допомогою musl, воно того варте, коли результат настільки задовольняє. Інші речі, які відрізняються від Alpine:

glibc ➔ мюсл systemd ➔ OpenRC GNU Core Utilities ➔ BusyBox

Щоб дізнатися більше про Alpine, перегляньте цю статтю, у якій докладно пояснюється, чому це добре.

Тепер давайте поговоримо про налаштування середовища пакування для Alpine Linux.

В поле зору

У моєму конкретному випадку я хотів би продовжувати використовувати свою систему Arch Linux, а також пакет для Alpine Linux. Для цього у вас є кілька варіантів:

Запустіть Alpine Linux на віртуальній машині Запустіть Alpine Linux у chroot Використовуйте контейнер Docker/Podman із постійним сховищем

Я негайно виключив перший варіант, оскільки не хотів турбуватися про програмне забезпечення віртуальної машини та вважав, що це додатково ускладнить моє налаштування.

Потім я запустив контейнер Docker, який запускає Alpine, і спробував зробити сховище постійним. Після того, як я натрапив на цю публікацію StackOverflow, виявилося, що це щось складніше, ніж очікувалося, і я почав відчувати, ніби я винаходжу віртуальні машини заново через усі ці прив’язки та дозволи монтування. Не дивно, що я також відмовився від цієї ідеї.

Пізніше я натрапив на чудову статтю на Alpine Wiki про створення chroot:

У середовищі chroot ви можете створювати, налагоджувати та запускати пакети Alpine або розробляти речі. Це найвідоміший спосіб зробити це без заміни системи чи використання віртуальної машини.

Саме те, що мені потрібно!

Вирішивши, що використовувати, я придумав план і придумав таку схему:

Давайте розберемо це:

Все працює під Arch Linux. Є контейнер chroot, який містить необхідні пакети та інструменти Alpine SDK. В Alpine пакети — це сценарії APKBUILD, які містять інструкції зі збирання для інструменту збирання. Є репозиторій Git, налаштований поза chroot для додавання/оновлення/видалення пакетів. Щоб взаємодіяти зі сховищами, ми можемо просто надіслати патч (тобто запит на злиття) до сховищ aports, які знаходяться на gitlab.alpinelinux.org/alpine/aports. Все, що нам потрібно зробити, це створити...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow