Поиск по сайту:

Как использовать Docker для упаковки приложений CLI


Docker — популярная платформа для упаковки приложений в виде автономных распространяемых артефактов. Он создает образы, которые включают в себя все, что вам нужно для запуска определенного программного обеспечения, например его исходный код, зависимости от сторонних пакетов и необходимые характеристики среды.

Поскольку образы Docker могут работать везде, где установлен Docker, они являются жизнеспособным форматом для распространения ваших приложений CLI. Экосистема Docker включает Docker Hub в качестве общедоступного реестра, доступного по умолчанию, что дает вам полную цепочку инструментов для публикации, обновления и документирования ваших инструментов.

Вот как вы можете использовать Docker для упаковки приложений CLI вместо традиционных менеджеров пакетов ОС и автономных двоичных загрузок.

Зачем использовать Docker для приложений CLI?

Docker может ускорить и упростить пользователям установку вашей новой утилиты. Они получают docker run your-app вместо того, чтобы искать инструкции по установке для конкретной платформы. Не требуется ручное извлечение архивов tar, копирование в системные папки или редактирование PATH.

Докеризованное программное обеспечение также позволяет пользователям легко выбирать разные версии, выполнять обновления и инициировать откаты. Каждый отдельный выпуск, который вы создаете, должен получить свой собственный неизменяемый тег, который однозначно идентифицирует его образ Docker. В отличие от обычных менеджеров пакетов, пользователи могут легко запускать две версии вашего программного обеспечения одновременно, запуская контейнеры на основе разных тегов изображений.

Еще одним преимуществом является простота, с которой пользователи могут безопасно опробовать ваше приложение, не беря на себя долгосрочных обязательств. Люди могут сомневаться в добавлении новых пакетов на свои машины, чтобы программное обеспечение не смогло полностью очиститься после удаления. Контейнеры Docker имеют собственную файловую систему; удаление контейнера не оставляет следов его существования на хосте. Это может побудить больше пользователей попробовать ваше приложение.

Одним из естественных следствий Dockerized-распределения является требование, чтобы у пользователей уже был запущен Docker на их машинах. В настоящее время многие разработчики будут использовать его как само собой разумеющееся, поэтому это довольно безопасный выбор. Если вы беспокоитесь о том, чтобы заблокировать пользователей, которые не хотят использовать Docker, вы все равно можете предоставить альтернативные варианты через существующие каналы распространения.

Создание образа Docker для приложения CLI

Образы Docker для приложений CLI мало чем отличаются от образов, используемых для любого другого типа программного обеспечения. Цель состоит в том, чтобы предоставить как можно более легкое изображение, но в то же время объединяющее все, что нужно вашему приложению для работы.

Обычно лучше всего начинать с минимального базового образа, на котором работает оптимизированная операционная система, такая как Alpine. Добавьте только те пакеты, которые требуются вашему программному обеспечению, такие как язык программирования, фреймворк и зависимости.

Две важные инструкции Dockerfile для инструментов CLI — это ENTRYPOINT и CMD. Вместе они определяют процесс переднего плана, который будет выполняться при запуске контейнеров из вашего образа. Большинство базовых образов по умолчанию запускают оболочку при запуске контейнера. Вы должны изменить это, чтобы ваше приложение запускалось автоматически, избавляя пользователей от необходимости вручную запускать его в контейнере.

Инструкция ENTRYPOINT Dockerfile определяет процесс переднего плана контейнера. Установите это в исполняемый файл вашего приложения:

ENTRYPOINT ["demo-app"]

Инструкция CMD работает в паре с ENTRYPOINT. Он предоставляет аргументы по умолчанию для команды, установленной в ENTRYPOINT. Аргументы, которые пользователь указывает при запуске контейнера с помощью docker run, переопределяют CMD, заданный в Dockerfile.

Хорошо использовать CMD, когда вы хотите показать некоторую основную справку или информацию о версии, когда пользователи пропускают определенную команду:

ENTRYPOINT ["demo-app"]
CMD ["--version"]

Вот несколько примеров, показывающих, как эти две инструкции приводят к запуску разных команд при создании контейнеров:

# Starting a new container from the "demo-app-image:latest" image

# Runs "demo-app --version"
docker run demo-app-image:latest

# Runs "demo-app demo --foo bar"
docker run demo-app-image:latest demo --foo bar

Ни в одном из примеров пользователю не требуется вводить имя исполняемого файла demo-app. Он автоматически используется как процесс переднего плана, потому что это сконфигурированный ENTRYPOINT. Команда получает аргументы, которые пользователь передал docker run после имени образа. Если аргументы не указаны, используется --version по умолчанию.

Эти две инструкции являются основными строительными блоками образов Docker, содержащих инструменты CLI. Вы хотите, чтобы основной исполняемый файл вашего приложения был процессом переднего плана по умолчанию, чтобы пользователям не приходилось вызывать его самостоятельно.

Собираем вместе

Вот образ Docker, который запускает простое приложение Node.js:

#!/usr/local/bin/node
console.log("Hello World");
FROM node:16-alpine
WORKDIR /hello-world

COPY ./ .

RUN npm install

ENTRYPOINT ["hello-world.js"]

Вариант базового образа Node на базе Alpine используется для уменьшения общего размера образа. Исходный код приложения копируется в файловую систему изображения с помощью инструкции COPY. Устанавливаются зависимости проекта npm, а скрипт hello-world.js устанавливается в качестве точки входа для изображения.

Соберите образ с помощью docker build:

docker build -t demo-app-image:latest

Теперь вы можете запустить изображение, чтобы увидеть, как Hello World передается на ваш терминал:

docker run demo-app-image:latest

На этом этапе вы готовы отправить свой образ в Docker Hub или другой реестр, откуда его смогут загрузить пользователи. Любой, у кого есть доступ к образу, сможет запустить ваше программное обеспечение, используя только интерфейс командной строки Docker.

Управление постоянными данными

Докеризация приложения CLI сопряжена с некоторыми проблемами. Наиболее важным из них является то, как обрабатывать сохраняемость данных. Данные, созданные в контейнере, теряются, когда этот контейнер останавливается, если только они не сохранены на внешнем томе Docker.

Вы должны записывать данные по четко определенным путям, по которым пользователи могут монтировать тома. Рекомендуется группировать все ваши постоянные данные в одном каталоге, например /data. Избегайте использования слишком большого количества местоположений, требующих подключения нескольких томов. В руководстве по началу работы должны быть описаны тома, необходимые вашему приложению, чтобы пользователи могли настроить сохраняемость при создании своего контейнера.

# Run demo-app with a data volume mounted to /data
docker run -v demo-app-data:/data demo-app-image:latest

Другие возможные проблемы

Проблема с монтированием возникает снова, когда вашей команде необходимо взаимодействовать с файлами в файловой системе хоста. Вот простой пример инструмента для загрузки файлов:

docker run file-uploader cp example.txt demo-server:/example.txt

Это заканчивается поиском example.txt внутри контейнера. В этой ситуации пользователям нужно будет связать mount свой рабочий каталог, чтобы его содержимое было доступно для контейнера:

docker run -v $PWD:/file-uploader file-uploader cp example.txt demo-server:/example.txt

Также важно подумать о том, как пользователи будут передавать значения конфигурации вашему приложению. Если вы обычно читаете файл конфигурации, имейте в виду, что пользователям нужно будет смонтировать его в каждый создаваемый ими контейнер. Предлагая альтернативные параметры, такие как флаги командной строки и переменные среды, можно оптимизировать работу для простых случаев использования:

# Setting the LOGGING_DRIVER environment variable in the container
docker run -e LOGGING_DRIVER=json demo-app-image:latest

Еще одна проблема касается интерактивных приложений, требующих ввода данных пользователем. Пользователям необходимо передать флаг -it в docker run, чтобы включить интерактивный режим и выделить псевдо-TTY:

docker run -it demo-app-image:latest

Пользователи должны не забывать устанавливать эти флаги, когда это необходимо, иначе ваша программа не сможет собирать какие-либо входные данные. Вы должны документировать команды, для которых требуется TTY, чтобы пользователи не были застигнуты врасплох неожиданными ошибками.

Эти камни преткновения означают, что Dockerized-приложения могут стать громоздкими, если они специально не разработаны с учетом контейнеризации. Пользователи получают лучший опыт, когда ваши команды чисты, не требуют взаимодействия с файловой системой и минимальной настройки. Когда это возможно, простой docker run image-name выполняет задачу простой установки и использования. Вы по-прежнему можете помещать в контейнеры более сложное программное обеспечение, но вы все больше зависите от пользователей, хорошо разбирающихся в интерфейсе командной строки Docker и его концепциях.

Краткое содержание

Docker не только для облачных развертываний и фоновых служб. Он также становится все более популярным как механизм распространения обычных консольных приложений. Вы можете легко публиковать, потреблять, запускать и поддерживать программное обеспечение с помощью единого интерфейса командной строки docker, который многие программисты уже используют изо дня в день.

Предложение готового к использованию образа Docker для вашего приложения дает пользователям больше выбора. Новички могут начать работу с помощью одной команды, которая настраивает предварительно настроенную среду со всеми зависимостями. Нет риска загрязнить файловую систему или среду своего хоста Docker, предотвратить конфликты с другими пакетами и гарантировать возможность вернуться к «чистому листу», если это необходимо.

Создание образа Docker обычно требует не больше, чем подпрограммы, которые вы уже используете для отправки сборок в различные диспетчеры пакетов ОС. Наиболее важными соображениями являются сохранение образа как можно меньшего размера и обеспечение того, чтобы точка входа и команда соответствовали вашему приложению. Это даст пользователям наилучшие возможности при использовании вашего Dockerized программного обеспечения.




Все права защищены. © Linux-Console.net • 2019-2024