В одном из моих предыдущих постов я описал, как создать контейнер Docker, служащий в качестве компоновщика для приложений ADF. Здесь я собираюсь показать, как использовать этот контейнер в качестве
функция на платформе Fn.
Прежде всего, давайте обновим контейнер, чтобы он соответствовал требованиям функции, то есть он может быть вызван как исполняемый двоичный файл, принимающий некоторые аргументы. В пустой папке я создал Dockerfile (простой текстовый файл с таким именем) со следующим содержимым:
1
2
|
FROM efedorenko/adfbuilder ENTRYPOINT [ "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=efedorenko fn 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 /build or 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 ps CONTAINER ID IMAGE CREATED STATUS NAMES 6e69a067b714 efedorenko /fn_adfbuilder :latest 3 seconds ago Up 2 seconds 01C5EJSJC847WK400000000000 e957cc54b638 fnproject /ui 21 hours ago Up 21 hours clever_turing 68940f3f0136 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, являются их собственными. |