В одном из моих предыдущих постов я описал, как создать контейнер Docker, служащий в качестве компоновщика для приложений ADF. Здесь я собираюсь показать, как использовать этот контейнер в качестве
функция на платформе Fn.
Прежде всего, давайте обновим контейнер, чтобы он соответствовал требованиям функции, то есть он может быть вызван как исполняемый двоичный файл, принимающий некоторые аргументы. В пустой папке я создал Dockerfile (простой текстовый файл с таким именем) со следующим содержимым:
|
1
2
|
FROM efedorenko/adfbuilderENTRYPOINT ["xargs","mvn","package","-DoracleHome=/opt/Oracle_Home","-f"] |
Этот файл содержит инструкции для Docker о том, как создать новый образ Docker из существующего (efedorenko / adfbuilder из предыдущего поста), и указывает точку входа, чтобы контейнер знал, что делать, если он был инициирован запуском Docker. команда. В этом случае всякий раз, когда мы запускаем контейнер, он выполняет цель пакета Maven для файла pom с именем, полученным из stdin . Это важно, так как платформа Fn использует stdin / stdout для ввода / вывода функций в качестве стандартного подхода.
В этой же папке мы выполним команду для создания нового образа Docker (fn_adfbuilder) из нашего файла Docker:
|
1
|
docker build -t efedorenko/fn_adfbuilder. |
Теперь, если мы запустим контейнер, передающий имя файла pom через стандартный ввод, вот так:
|
1
|
echo -n "/opt/MySampleApp/pom.xml" | docker run -i --rm efedorenko/fn_adfbuilder |
Контейнер выполнит внутри себя то, что нам действительно нужно:
|
1
|
mvn package -DoracleHome=/opt/Oracle_Home -f/opt/MySampleApp/pom.xml |
По сути, сделав это, мы получили контейнер, действующий как функция. Он создает приложение для данного файла POM .
Давайте использовать эту функцию на платформе Fn. Установка Fn на вашем локальном компьютере так же проста, как вызов одной команды и описана на странице проекта GnHub Fn . После установки Fn мы можем указать реестр Docker, в котором мы будем хранить образы наших функций-контейнеров и запустить сервер Fn:
|
1
2
|
export FN_REGISTRY=efedorenkofn start |
Следующим шагом является создание приложения Fn, которое будет использовать нашу удивительную функцию:
|
1
|
fn apps create adfbuilderapp |
Для этого вновь созданного приложения мы должны указать маршрут к нашему ограничителю функции, чтобы приложение знало, когда и как его вызывать:
|
1
|
fn routes create --memory 1024 --timeout 3600 --type async adfbuilderapp /build efedorenko/fn_adfbuilder:latest |
Мы создали маршрут, в котором говорится, что всякий раз, когда ресурс / build запрашивается для adfbuilderapp , платформа Fn должна создавать новый контейнер Docker на основе последней версии образа fn_adfbuilder из репозитория efedorenko и запускать его, предоставляя 1 ГБ памяти и передавая аргументы в stdin ( режим по умолчанию).
Кроме того, поскольку сборка занимает много времени и ресурсов, мы собираемся вызвать функцию в асинхронном режиме с часовым таймаутом. После создания маршрута мы можем вызвать функцию с помощью Fn Cli :
|
1
2
3
4
5
|
echo -n "/opt/MySampleApp/pom.xml" | fn call adfbuilderapp /buildor over http:curl -d "/opt/MySampleApp/pom.xml" http://localhost:8080/r/adfbuilderapp/build |
В обоих случаях платформа поместит вызов в очередь (поскольку он асинхронный) и вернет идентификатор вызова:
|
1
|
{"call_id":"01C5EJSJC847WK400000000000"} |
Функция работает сейчас, и мы можем проверить, как она работает, различными способами. Поскольку вызов функции — это просто создание и запуск контейнера Docker, мы можем увидеть его, получив список всех запущенных контейнеров:
|
1
2
3
4
5
6
7
8
9
|
docker psCONTAINER ID IMAGE CREATED STATUS NAMES6e69a067b714 efedorenko/fn_adfbuilder:latest 3 seconds ago Up 2 seconds 01C5EJSJC847WK400000000000e957cc54b638 fnproject/ui 21 hours ago Up 21 hours clever_turing68940f3f0136 fnproject/fnserver 27 hours ago Up 27 hours fnserver |
Fn создал новый контейнер и в качестве имени использовал идентификатор вызова функции. Мы можем прикрепить наш stdin / stdout к контейнеру и посмотреть, что происходит внутри:
|
1
|
docker attach 01C5EJSJC847WK400000000000 |
После выполнения функции мы можем использовать Fn Rest API (или Fn Cli) для запроса информации о вызове:
|
1
2
3
|
http://localhost:8080/v1/apps/adfbuilderapp/calls/01C5EJSJC847WK400000000000{"message":"Successfully loaded call","call":{"id":"01C5EJSJC847WK400000000000","status":"success","app_name":"adfbuilderapp","path":"/build","completed_at":"2018-02-03T19:52:33.204Z","created_at":"2018-02-03T19:46:56.071Z","started_at":"2018-02-03T19:46:57.050Z","stats":[{"timestamp":"2018-02-03T19:46:58.189Z","metrics": |
……
|
1
|
http://localhost:8080/v1/apps/adfbuilderapp/calls/01C5EJSJC847WK400000000000/log |
|
1
|
{"message":"Successfully loaded log","log":{"call_id":"01C5EKA5Y747WK600000000000","log":"[INFO] Scanning for projects...\n[INFO] ------------------------------------------------------------------------\n[INFO] Reactor Build Order:\n[INFO] \n[INFO] Model\n[INFO] ViewController\n[INFO] |
Мы также можем следить за вызовами функций с помощью панели инструментов Fn UI :
Результатом нашей работы является функция, которая создает приложения ADF. Прелесть этого в том, что пользователь функции, вызывающий, просто использует Rest API через http, чтобы создать приложение, и вызывающему абоненту все равно, как и где будет выполнена эта работа. Но звонящий точно знает, что вычислительные ресурсы будут использоваться не дольше, чем это необходимо для выполнения работы.
В следующий раз мы попытаемся организовать функцию в Fn Flow.
Это оно!
| Опубликовано на Java Code Geeks с разрешения Евгения Федоренко, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Fn Функция для создания приложения Oracle ADF
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |
