Есть проект, использующий Servlet API из Jakarta EE
Проект рассчитан на запуск в Apache Tomcat версии 10.1.x
В этом проекте всё максимально серьёзно: мы никому не доверяем, поэтому сами собрали ключевые компоненты:
Для всех файлов сосчитаны контрольные суммы (файлы с расширением *.sha512) и все файлы с контрольными суммами подписаны (файлы с расширением *.sha512.asc)
Публичный ключ, с помощью которого можно проверить подпись, расположен в репозитории под именем key.gpg
Отпечаток ключа: 70092656FB28DBB76C3BB42E89619023B6601234
Посмотреть можно командой:
gpg --dry-run --import --import-options import-show ./key.gpg
pub rsa4096 2023-04-09 [SCEA] [expires: 2033-04-06]
70092656FB28DBB76C3BB42E89619023B6601234
uid Slurm (Main Key) <slurm@slurm.io>
gpg: Total number processed: 1Для верификации файлов берём доверенный образ от Bellsoft
Важно: при ссылке на образ указывайте не tag, а sha256 digest!
Важно: URL'ы файлов должны быть заданы с помощью аргументов сборки:
GPG_KEY_URLROOTFS_URLMAVEN_URLTOMCAT_URL
URL'ы файлов с контрольными суммами и подписями (для п.1-4) рассчитываются путём добавления соответствующих суффиксов
Затем устанавливаем туда GnuPG и проверяем все файлы в следующем порядке:
- Сначала проверяем отпечаток ключа
key.gpg(должен быть70092656FB28DBB76C3BB42E89619023B6601234) - Затем проверяем контрольные суммы файлов с расширением
tar.gz - Затем проверяем подписи файлов с контрольными суммами
Если всё ОК, то переходим к этапу 2
Для упрощения, можете зашить контрольные суммы в Dockerfile, хотя можете предложить и решение получше
Спойлеры
Можете подглядеть официальные образы Java-приложений, чтобы посмотреть, как это примерно происходит
Например, образ Maven
Берём Scratch, накатываем туда:
- Root ФС
- Maven (в каталог
/opt/bin/maven)
Важно: Maven должен быть именно в /opt/bin/maven, а не в /opt/bin/maven/apache-maven-3.9.1
Прописываем следующие переменные окружения:
PATH=/usr/lib/jvm/jdk-17.0.6-bellsoft-x86_64/bin:/opt/bin/maven/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binLANG=en_US.UTF-8LANGUAGE=en_US.UTF-8:enJAVA_HOME=/usr/lib/jvm/jdk-17.0.6-bellsoft-x86_64MAVEN_HOME=/opt/bin/maven
Запускаем сборку:
mvn verifyВ результате должен появиться файл target/api.war
Берём Scratch, накатываем туда:
- Root ФС
- Tomcat (в каталог
/opt/bin/tomcat)
Важно: Tomcat должен быть именно в /opt/bin/tomcat, а не в /opt/bin/tomcat/apache-tomcat-10.1.7
Прописываем следующие переменные окружения:
PATH=/usr/lib/jvm/jdk-17.0.6-bellsoft-x86_64/bin:/opt/bin/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binLANG=en_US.UTF-8LANGUAGE=en_US.UTF-8:enJAVA_HOME=/usr/lib/jvm/jdk-17.0.6-bellsoft-x86_64CATALINA_HOME=/opt/bin/tomcat
В качестве CMD указать catalina.sh run
WAR закинуть в $CATALINA_HOME/webapps так, чтобы приложение было доступно по адресу: http://localhost:8080/api (тестировать методом GET) в ответ придёт:
{"status": "ok"}Важно: должно быть именно /api (если не удаётся – см. спойлеры)
Стандартные приложения (вроде manager и остальных) нужно удалить
Спойлеры
Во многих системах есть "специальные" имена
Например, в Tomcat есть такое имя – ROOT.war
Попробуйте найти в документации, для чего оно используется
- Собрать всё согласно описанию выше (по этапам)
- Выложить результаты последнего этапа в виде публичного образа на GHCR (GitHub Container Registry)
Рекомендуется, но не обязательно, запускать приложение не от root
- Всё должно быть оформлено в виде публичного репозитория на GitHub
- Вся сборка образов должна проходить через GitHub Actions
- Образ должен выкладываться в GitHub Container Registry (GHCR)
К текущему заданию дополнительно предъявляются требования:
- Docker Buildx Build (указывайте явно при сборке
docker buildx build) - Multi-Stage