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 образов выполняются следующие действия в указанном ниже порядке:

  1. Распакуйте полученный архив с дистрибутивом Агента СМЭВ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
  1. В каталоге 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
 ...
  1. В каталоге 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
  1. В созданном файле Dockerfile, ниже комментария APPLICATION specific, раскомментируйте строку, относящуюся к тому компоненту, образ для которого требуется собрать. Например, для сборки Агента, раскомментировать строку COPY einfahrt/app/app.jar app/app.jar

Внимание

Для каждой сборки должна быть раскомментирована только одна строка COPY в данном разделе

  1. Выполните команду:

docker build . -t einfahrt:latest

Tag должен соответствовать имени собираемого образа приложения.

  1. Повторите пункты 4 и 5 для опциональных компонентов Notarius и Prohibitor, с раскомментированием соответствующей строки в Dockerfile и указанием корректного тега образа в команде docker build.

  2. Сохраните созданные образы в файлы. Пример ниже - для Агента, при сохранении образов опциональных Prohibitor и Notarius укажите соответствующие имена.

docker save einfahrt:latest | gzip >einfahrt.tgz
  1. Скопируйте полученные .tgz-архивы на целевые сервера.