Столкнулся с интересной проблемой когда внедрял сборку контейнеров под ARM64 процессоры. Есть программа на Java контейнер которой использовал образ "eclipse-temurin:17-jre-alpine" в качестве базового. Для этого базового образа отсутствует вариант для платформы linux/arm64 и стоял вопрос что безопаснее сделать:
- перейти на "eclipse-temurin:17-jre-noble" который использует Ubuntu вместо Alpine
- перейти на "eclipse-temurin:21-jre-alpine" который влечёт обновление Java с 17 на 21
Разработчик выбрал первый вариант (перейти на "eclipse-temurin:17-jre-noble"), т.к. обновление версии Java выглядит рискованным (может повлечь неожиданные эффекты в какой-либо из библиотек) и требует полного цикла тестирования которое провести сейчас нет возможности.
Я также считал что замена Alpine на Ubuntu при сохранении версии Java является менее рискованным, хотя и повлечёт увеличение размера образа контейнера и возможные риски из-за замены musl на libc (хотя я не особо верю в вероятность таких неприятностей). Забегая вперёд, мы потратили несколько часов разбираясь почему программа перестала запускаться.
Весело стало практически сразу когда упали тесты, которые проверяли изменение. Т.е. мы ещё даже не дошли до запуска ARM64 сборки, а AMD64 уже перестала работать. По логам выглядело что программа не может найти конфигурацию IdP (Identity provider), но конфигурация не менялась, впрочем и сам код программы также не менялся. Начали отлаживать - в kubernetes кластере, программа загружает часть конфигурации из переменных окружения, а остальное из файлов, которые на самом деле примонтированные секреты.
Добавили в код вывод конфигурации в логи - пустые блоки. Т.е. программа не загрузила вообще ничего! Дальше перенесли конфигурацию IdP из переменных окружения в файл и программа запустилась.
После этого дописали вывод имён переменных окружения, которые "видит" программа и там оказались только переменные без точки в имени. Фреймворк, который используется в этой программе, позволяет задать нужную настройку в виде переменных окружения с точкой в имени, например app.identityProviders.auth0.userDisplayName=email
, и из-за того что программа их не "видит" она и перестала работать. Погуглили и выяснилось что в Java есть проблемы с недоступностью переменных окружения в имени которых есть точка и связано это с шеллом!
В Alpine версии /bin/sh указывает на busybox, а в Ubuntu версии это Dash (ещё во времена Ubuntu 6.10 Dash стал интерпретатором по-умолчанию). Попробовали запустить программу используя bash в роли шелла - работает. Обновили ссылку /bin/sh на /bin/bash и программа прошла все тесты без ошибок.
Мой список "что может пойти не так" дополнился ещё одним пунктом.
Комментариев нет:
Отправить комментарий