10. Приложение Д «Подготовка Docker-образов для возможности запуска приложений под Docker (podman)»
10.1. Подготовительные действия
Для создания Docker-образов необходимы соблюдение следующих требований:
Рабочая станция, на которой установлена одна из сертифицированных ОС (ALT 8 SP Server 10, RedOS 7.3, Astra Linux 1.7 SE).
Docker либо podman из дистрибутива ОС.
Приобретенная пользователем лицензия на одну из указанных выше ОС; загруженный локально базовый Docker образ этой ОС, предоставленный производителем.
Доступ с данной рабочей станции к репозиторию ОС, выбранной в качестве базовой для Docker-образа, либо доступная в локальной сети копия репозитория. (В случае локальной копии необходимо внести изменения в указанный ниже пример Dockerfile. Подобная настройка делается администратором и выходит за рамки данного Руководства).
Приобретенная пользователем лицензия на Axiom JDK 17-й версии, загруженный на локальный диск пакет Axiom JDK, соответствующий операционной системе базового Docker образа.
Загруженный с сайта cryptopro.ru установочный пакет CryptoPro CSP 5R3, соответствующий операционной системе базового Docker образа.
10.2. Создание Docker образов
Для создания необходимых Docker образов выполняются следующие действия в указанном ниже порядке:
Распакуйте полученный архив с дистрибутивом Агента СМЭВ4 в каталог
/distr(имя каталога может быть другим, далее данное имя используется в качестве примера). В результате распаковки должна создаться следующая файловая структура:
distr
├── einfahrt
│ └── app
│ └── app.jar
├── notarius
│ └── app
│ └── app.jar
└── prohibitor
├── app
│ └── app.jar
├── prohibitor-cli
│ ├── application.yml
│ ├── prohibitor-cli-x.xx.x-SNAPSHOT.jar
│ └── README.md
└── totp-cli
└── totp_cli
В каталоге
distrсоздайте подкаталогfiles; В подкаталогfilesвыложите дистрибутив Axiom JDK и CryptoPro CSP. В примерах ниже используются пакеты, применяемые для ALT 8 SP Server 10, для других ОС имена пакетов, а также версии, могут отличаться.
distr
├── files
│ ├── linux-amd64.tgz # дистрибутив CryptoPro CSP
│ └── axiomjdk-jdk-certified17.0.6+11-linux-amd64.alt8.rpm # установочный пакет Axiom JDK
├── einfahrt
...
В каталоге
distrсоздайте файл с именемDockerfile, содержащий приведенную ниже информацию.
Примечание
Приведенный ниже пример Dockerfile использует ALT 8 SP Server 10 в качестве базовой ОС. В случае использования другой ОС, требуется внесение соответствующих корректив в Dockerfile: имя образа базовой ОС, используемый менеджер пакетов и т.п. Данные изменения производятся администратором, и выходят за рамки данного Руководства. Более подробную информацию можно получить в документации на используемую операционную систему. В примере ниже подразумевается что базовый образ ОС предварительно загружен локально.
# Based on official ALT 8 SP Server 10 image and certified Axiom JDK 17.0
#
# USAGE:
# START_CMD can be redefined as axternal parameter. By default - "java -cp app/* -jar app/app.jar"
# JDK_JAVA_OPTIONS can be EXTENDED by external parameter with the same name, but can't be redefined
# also checks presence of mounted external file certs/cacerts, if exist it will be used instead of default
# В следующей строке указать базовый образ выбранной операционной системы
FROM altsp:c10f1
COPY files/ /tmp/
RUN apt-get update \
&& apt-get install -y glibc-locales unzip openssl \
&& apt-get clean \
&& adduser -u 1000 -d /egov -m -U -l app \
&& usermod -L app \
&& mkdir -p /egov/java/app \
&& chown -R 1000:1000 /egov/java \
&& cd /tmp \
&& apt-get install -y ./axiomjdk-jdk-certified17.0.6+11-linux-amd64.alt8.rpm \
&& tar xzvf linux-amd64.tgz \
&& cd linux-amd64 \
&& apt-get update \
&& apt-get install -y lsb-cprocsp-base*.rpm lsb-cprocsp-rdr-64-*.rpm lsb-cprocsp-kc1-64-*.rpm \
lsb-cprocsp-capilite-64-*.rpm lsb-cprocsp-devel-*.rpm lsb-cprocsp-kc2-64-*.rpm \
cprocsp-curl-64-*.rpm \
&& ./install.sh \
&& cd /tmp \
&& rm -rf axiomjdk-jdk-certified17.0.6+11-linux-amd64.alt8.rpm linux-amd64 linux-amd64.tgz \
&& echo -e '#!/bin/bash -l \n\
[ -z "${START_CMD}" ] && START_CMD="java -jar app/app.jar" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-exports=java.base/sun.security.util=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-exports=java.base/sun.security.x509=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-exports=java.base/sun.security.pkcs=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-exports=java.base/sun.security.provider=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-exports=java.base/sun.security.tools.keytool=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-exports=java.base/sun.net=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-opens=java.base/java.lang=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-opens=java.base/java.nio=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-opens=java.xml/org.w3c.dom=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} --add-opens=java.base/java.util=ALL-UNNAMED" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -Dio.netty.tryReflectionSetAccessible=true" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -Dsaffron.default.charset=UTF-16LE" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -Dsaffron.default.collation.name=UTF-16LE\$en_US" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -Dsaffron.default.nationalcharset=UTF-16LE" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -XX:+UseContainerSupport" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -XX:InitialRAMPercentage=80.0" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -XX:MaxRAMPercentage=80.0" \n\
DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -XX:+FlightRecorder" \n\
[ -f certs/cacerts ] && DEFAULT_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} -Djavax.net.ssl.keyStore=certs/cacerts -Djavax.net.ssl.trustStore=certs/cacerts" \n\
JDK_JAVA_OPTIONS="${DEFAULT_JAVA_OPTIONS} ${JDK_JAVA_OPTIONS}" \n\
export JDK_JAVA_OPTIONS \n\
[ -d /chgCfgTmp ] && cp -f /chgCfgTmp/* /egov/java \n\
exec ${START_CMD} \n' >/docker-entrypoint.sh \
&& chmod 755 /docker-entrypoint.sh
ENV PATH=${PATH}:/opt/cprocsp/bin/amd64
WORKDIR /egov/java
ENTRYPOINT ["/docker-entrypoint.sh"]
RUN chown -R 1000 /etc/opt/cprocsp \
&& echo -e '[ -s /egov/csp.lic ] && /opt/cprocsp/sbin/amd64/cpconfig -license -set $(cat /egov/csp.lic)' >>/etc/profile.d/license_cpro.sh
#############################################
# APPLICATION specific #
#############################################
# При сборке образа, ниже должна быть раскомментирована только одна строка!
# Раскомментировать при сборке образа Агента СМЭВ4
#COPY einfahrt/app/app.jar app/app.jar
# Раскомментировать при сборке образа Prohibitor
#COPY prohibitor/app/app.jar app/app.jar
# Раскомментировать при сборке образа Notarius
#COPY notarius-ng/app/app.jar app/app.jar
В созданном файле
Dockerfile, ниже комментарияAPPLICATION specific, раскомментируйте строку, относящуюся к тому компоненту, образ для которого требуется собрать. Например, для сборки Агента, раскомментировать строкуCOPY einfahrt/app/app.jar app/app.jar
Внимание
Для каждой сборки должна быть раскомментирована только одна строка COPY в данном разделе
Выполните команду:
docker build . -t einfahrt:latest
Tag должен соответствовать имени собираемого образа приложения.
Повторите пункты 4 и 5 для опциональных компонентов Notarius и Prohibitor, с раскомментированием соответствующей строки в
Dockerfileи указанием корректного тега образа в командеdocker build.Сохраните созданные образы в файлы. Пример ниже - для Агента, при сохранении образов опциональных Prohibitor и Notarius укажите соответствующие имена.
docker save einfahrt:latest | gzip >einfahrt.tgz
Скопируйте полученные .tgz-архивы на целевые сервера.