Как передать свойства в контекст tomcat без использования catalina.properties или есть лучший способ ввести свойства?

Мы пытаемся переместить наши проекты в докер, используя образ tomcat, и немного не понимаем, как вводить свойства.

Наша конфигурация прямо для конфигурации базы данных теперь выглядит так:

/opt/tomcat/conf/context.xml

<Context>

    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <ResourceLink name = "DBCON"
                  global = "jdbc/DBCON"
                  auth = "Container"
                  type = "javax.sql.DataSource"/>

    <Resource name = "jdbc/DBCON"
              auth = "Container"
              type = "javax.sql.DataSource"
              driverClassName = "oracle.jdbc.OracleDriver"
              url = "${oracle.database.url}"
              username = "${oracle.database.username}"
              password = "${oracle.database.password}"
              maxActive = "100"
              maxIdle = "20"
              minIdle = "5"
              maxWait = "10000"/>

</Context>

/opt/tomcat/conf/catalina.properties

some other properties ...
...
...
oracle.database.url=jdbc:oracle:thin:@dev-database.com:1521:dev1
oracle.database.username=user
oracle.database.password=pass

Мы надеемся использовать секреты, которые отображаются в какое-то место на сервере /some/loc/secrets/oracle.database.properties, но не понимаем, как их вводить в context.xml, и мы не хотим добавлять или редактировать файл cataline.properties. Мы планируем перейти на пружинную загрузку в будущем, но для некоторых проектов работа довольно серьезна.

Я нашел примеры <Envrionment> и <PreResources>, но не понимаю, как мы можем указать context.xml на самом деле использовать эти свойства.

В чем преимущество параметризации таких свойств? Я бы поместил их статически в кота.

NiVeR 22.06.2018 23:43

@NiVeR преимущество - безопасность.

Octavian R. 22.06.2018 23:50

Почему бы не использовать встроенную функцию Секрет докера с файлом свойств? Если вы используете Spring, вы можете использовать аннотацию @PropertySource для загрузки файла.

Praveen Premaratne 22.06.2018 23:51

@NiVeR Они должны быть динамичными для различных сред и безопасности. @PraveenP Мы используем секреты докеров для других служб, отличных от java / tomcat. Не потребуется ли при использовании @PropertySource изменения кода?

flip66 23.06.2018 00:03

@ flip66 Хорошо, но у вас будут разные коты для каждой среды, не так ли? Это вопрос выбора. Также можно иметь несколько файлов application-{profile}.properties и заполнять свойства по профилю.

NiVeR 23.06.2018 00:06

@ flip66 Я знаю, что это старый вопрос, но что вы сделали, чтобы решить эту проблему? У меня такая же проблема с Dockerizing устаревшими приложениями Spring, и я также хотел бы иметь возможность параметризовать context.xml с помощью файла секретов. Закончилось изменение catalina.properties, но не выглядит элегантным.

Noky 18.12.2018 16:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
3 553
2

Ответы 2

Задайте как системные переменные свойства вашей БД:

export JAVA_OPTS=$JAVA_OPTS -Doracle.database.username=user -Doracle.database.password=pass

Мы делаем это на нашем локальном компьютере, но не можем сделать это в PROD.

flip66 22.06.2018 23:50

@ flip66 Могу я спросить, почему бы и нет? Это один из предпочтительных подходов большинства разработчиков.

Praveen Premaratne 22.06.2018 23:54

@ flip66 действительно почему? Это очень распространенный подход. Если вы не можете этого сделать, то вам не следует использовать JNDI. Вы должны создать свои соединения с БД с помощью Spring или почему бы и нет, вручную, а затем вы можете поместить свою конфигурацию БД в файл свойств. Другой подход - не использовать глобальный файл context.xml из tomcat/conf. У вас есть возможность включить в свою папку WEB-INF, если я не ошибаюсь, пользовательский файл context.xml.

Octavian R. 23.06.2018 00:02

У нас есть строгое требование не помещать пароли в переменные среды, поэтому мы используем секреты докеров (файлы). Мы рассмотрели отображение всего файла контекста для этого приложения в /opt/tomcat/conf/Catalina/localhost/someapp.xml, но похоже, что это противоречит цели создания образа, поскольку мы пытаемся минимизировать накладные расходы OP.

flip66 23.06.2018 00:06

Как уже упоминалось другими, переменные в файле context.xml должны быть доступны как системные свойства. Из справочника по конфигурации Tomcat:

Tomcat configuration files are formatted as schemaless XML; elements and attributes are case-sensitive. Apache Ant-style variable substitution is supported; a system property with the name propname may be used in a configuration file using the syntax ${propname}. All system properties are available including those set using the -D syntax, those automatically made available by the JVM and those configured in the $CATALINA_BASE/conf/catalina.properties file

Если вам нужны эти секретные значения в другом файле, вы можете переопределить CMD контейнера докеров Tomcat. Это может быть, например, сценарий оболочки, который считывает переменные из файла, экспортирует их, как в ответе @ Octavian, и только после этого запускает сервер.

Другие вопросы по теме