.. _annex_e: Приложение Д "Подготовка Docker образов для возможности запуска приложений под Docker (podman)" ============================================================================================= Подготовительные действия ------------------------- Для создания 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 образа. Создание Docker образов ----------------------- Для создания необходимых Docker образов выполняются следующие действия в указанном ниже порядке: 1. Распаковать полученный архив с дистрибутивом Агента СМЭВ4 в каталог ``/distr`` (имя каталога может быть другим, далее данное имя используется в качестве примера). В результате распаковки должна создаться следующая файловая структура: .. code-block:: 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 2. В каталоге ``distr`` создать подкаталог ``files``; В подкаталог ``files`` выложить дистрибутив **Axiom JDK** и **CryptoPro CSP**. В примерах ниже используются пакеты, применяемые для ALT 8 SP Server 10, для других ОС имена пакетов, а также версии, могут отличаться. .. code-block:: distr ├── files │   ├── linux-amd64.tgz # дистрибутив CryptoPro CSP │   └── axiomjdk-jdk-certified17.0.6+11-linux-amd64.alt8.rpm # установочный пакет Axiom JDK ├── einfahrt ... .. attention: RPM пакет Axion JDK различается для ОС Alt Linuix и RedOS. Для Alt Linux следует использовать пакет с суффиксом "alt8", например: axiomjdk-jdk-certified17.0.6+11-linux-amd64.**alt8**.rpm 3. В каталоге ``distr`` создать файл с именем ``Dockerfile``, содержащий приведенную ниже информацию. .. note:: Приведенный ниже пример Dockerfile использует ALT 8 SP Server 10 в качестве базовой ОС. В случае использования другой ОС, требуется внесение соответствующих корректив в Dockerfile: имя образа базовой ОС, используемый менеджер пакетов и т.п. Данные изменения производятся администратором, и выходят за рамки данного Руководства. Более подробную информацию можно получить в документации на используемую операционную систему. В примере ниже подразумевается что базовый образ ОС предварительно загружен локально. .. code-block:: bash # 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 4. В созданном файле ``Dockerfile``, ниже комментария ``APPLICATION specific``, раскомментировать строку, относящуюся к тому компоненту, образ для которого требуется собрать. Например, для сборки Агента, раскомментировать строку ``COPY einfahrt/app/app.jar app/app.jar`` .. attention:: Для каждой сборки должна быть раскомментирована только одна строка COPY в данном разделе 5. Выполнить команду: .. code-block:: bash docker build . -t einfahrt:latest Tag должен соответствовать имени собираемого образа приложения 6. Повторить пункты 4 и 5 для опциональных компонентов Notarius и Prohibitor, с раскомментированием соответствующей строки в ``Dockerfile`` и указанием корректного тега образа в команде ``docker build``. 7. Сохранить созданные образы в файлы. Пример ниже - для Агента, при сохранении образов опциональных Prohibitor и Notarius указать соответствующие имена. .. code-block:: bash docker save einfahrt:latest | gzip >einfahrt.tgz 8. Скопировать полученные .tgz архивы на целевые сервера.