Запуск агента СМЭВ4 (ПОДД) под docker
Команда СМЭВАгент, упакованный в docker image, уже имеет предустановленными все необходимые компоненты (java, CryptoPro CSP, CryptoPro JCP).
Входящие в поставку версии CryptoPro не имеют предустановленной лицензии, и могут работать как trial в течение трех месяцев с момента создания образа.
Предусмотрена возможность передачи номеров лицензий CSP и JCP при запуске контейнера, которая подробно описано в Руководстве Администратора агента ПОДД СМЭВ.
Шаги, необходимые для запуска агента для ОС centos 7 под docker:
От имени администратора сервера (root):
1) установить docker
curl -fsSL https://get.docker.com/ | sh
2) создать пользователя и добавить его в группу docker:
adduser $USER
usermod -aG docker $USER
где $USER - имя пользователя
3) запустить docker
systemctl start docker
4) cкачать образ и дистрибутив агента с портала раздел "Для подключения к СМЭВ 4".
От имени пользователя:
5) загрузить docker образ агента в локально установленный docker, на машине, где будет работать агент.
docker load < agent_v.tgz
где agent_v.tgz – имя полученного архива с docker image агента
Загрузка должна завершиться без ошибок.
проверить загрузку можно командой
docker images
которая должна вернуть примерно следующую запись:
einfahrt latest c7511824117e 5 days ago 1.2GB
6) cформировать конфиг агента application.yml
Как его формировать описано в README.txt в архиве "Дистрибутив агента версия v.zip", там же шаблоны конфигов для разных сред и ролей агентов.
7) скопировать/сформировать в одной директории сервера следующий комплект:

- конфиг агента application.yml;
- ключи контейнера закрытого ключа сертификата, привязанного к агенту в директорию keys;
- файл cp_ca_store из архива "Дистрибутив агента версия v.zip" в директорию certs;
- Скрипт запуска docker образа (einfahrt.sh).
Пример скрипта:
#!/bin/bash
IMG="einfahrt:latest"
NAME="einfahrt"
echo "Checking for already started container, stop it if running"
[ ! -z $(docker ps |awk '{print $NF}'|grep "^${NAME}$") ] && docker stop ${NAME}
[ ! -z $(docker ps -a |awk '{print $NF}'|grep "^${NAME}$") ] && docker rm ${NAME}
DIR=$(pwd)
# установка прав на объекты
for OBJECT in certs keys; do
find ${OBJECT} \( -type f -exec chmod 0666 {} + \) -o \( -type d -exec chmod 0777 {} + \)
done
# Если есть лицензии КриптоПро, они должны находиться в текстовом виде в файлах licenses/csp.lic и licenses/jcp.lic
# for OBJECT in jcp csp; do
# [ -f licenses/${OBJECT}.txt ] && LICENSE=" ${LICENSE} --mount type=bind,source=${DIR}/licenses/${OBJECT}.txt,target=/egov/${OBJECT}.lic,readonly"
# done
echo "Starting docker container"
docker run \
-d \
--user=1000 \
--net=host \
--name ${NAME} \
--mount type=bind,source=${DIR}/certs,target=/egov/java/certs \
--mount type=bind,source=${DIR}/keys,target=/var/opt/cprocsp/keys/app \
--mount type=bind,source=${DIR}/application.yml,target=/egov/java/application.yml \
--env JDK_JAVA_OPTIONS="-XX:+UnlockExperimentalVMOptions -XX:InitiatingHeapOccupancyPercent=16 -XX:+UseStringDeduplication -XX:+G1EagerReclaimHumongousObjects -XX:+G1EagerReclaimHumongousObjectsWithStaleRefs -XX:G1HeapWastePercent=2 -XX:G1MaxNewSizePercent=25 -XX:G1MixedGCLiveThresholdPercent=15 -XX:+UseG1GC" \
${IMG}
[ $? -eq 0 ] && echo "Application started. Container name: ${NAME}. Available ports: 8183 (jdbc), 8192 (REST + driver download), 8171 (API gateway), 8182 (OpenAPI specifications)" || echo "Error starting docker."
8) выдать права на выполнение скрипта:
chmod +x einfahrt.sh
9) выполнить скрипт запуска:
./einfahrt.sh
10) Проверить работу агента и его связь с ядром ПОДД:
curl -X POST -H "Accept-Version:1" -H "Content-Type: application/json" -d '{"sql": {"sql": "select 1"}}' http://localhost:8192/query --silent -m 30
Получить лог-файл агента, запущенного под docker данным скриптом, можно командой
docker logs einfahrt
В ряде случаев возможна остановка контейнера через несколько секунд после запуска, с сообщением в логе «java.lang.IllegalStateException: Ошибка вызова функции acquireContext: 0x8009001a».
В этом случае следует изменить владельца каталога keys и вложенных подкаталогов и файлов на пользователя с id=1000:
chown -R 1000 keys
после чего повторить выполнение скрипта запуска контейнера.