Docker-compose: передача переменной в контекст tomcat

У меня такая проблема:

Я хочу определить переменную среды в моем файле docker-compose.yml следующим образом:

services:
  nginx:
    image: nginx:1.13
    container_name: nginx
    restart: always
    ports: 
        - "80:80"
        - "9090:9090"
    volumes: 
        - ./nginx/conf.d:/etc/nginx/conf.d
        - ./nginx/html:/usr/share/nginx/html

  webapp:
    build: WebApp
    container_name: webapp
    environment:
      - WEBAPPDB=jdbc:mysql://192.168.101.129:3306/webapp?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
    expose: 
        - "8080"
    depends_on:
        - nginx
version: '2'

приложение webapp развертывается с использованием tomcat. Я хотел бы использовать переменную WEBAPPDB в файле context.xml следующим образом:

<Resource
        auth = "Container"
        driverClassName = "com.mysql.jdbc.Driver"
        type = "javax.sql.DataSource"

        initialSize = "0"
        maxActive = "10"
        maxIdle = "5"
        maxWait = "5000"
        minIdle = "0"
        timeBetweenEvictionRunsMillis = "34000"
        minEvictableIdleTimeMillis = "55000"

        testOnBorrow = "true"
        testWhileIdle = "true"
        testOnReturn = "false"
        validationQuery = "SELECT 1 FROM dual"
        validationInterval = "30000"
        removeAbandoned = "true"
        removeAbandonedTimeout = "10"

        name = "jdbc/webapp"
        username = "username"
        password = "password"
        url = "${WEBAPPDB}"
    />

Как я могу это сделать? спасибо за помощь.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
1
0
2 736
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

По документации Справочник по настройке 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.

Чтобы он работал, переменная WEBAPPDB в context.xml должна быть доступна как системное свойство. Вы можете установить свойства системы несколькими способами (см. Tomcat 7 - где мне установить "системные свойства"? ). В вашем случае вы можете установить переменную среды JAVA_OPTS в файле docker-compose:

environment:
  - JAVA_OPTS=-DWEBAPPDB=jdbc:mysql://192.168.101.129:3306/webapp?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8

@ b0fusb Я пробовал этот способ, но он не работает. Это не проблема переменных окружения (если я войду в контейнер, echo $ JAVA_OPTS напечатает мне эти переменные). Но похоже, что файл context.xml не видит переменных среды

br1 20.07.2018 14:31
Ответ принят как подходящий

Работая таким образом:

docker-compose.yml:

services:
  webapp:
    build: webapp
    container_name: webapp
    environment:
      - JAVA_OPTS= -Ddb.url=192.168.101.129 -Ddb.port=3306 -Ddb.username=test -Ddb.password=test

Dockerfile:

FROM bp91/ubuntu16.04-tomcat7-java8

COPY webapps /tmp/webapps/

ADD tomcat/bin /opt/tomcat/bin/

RUN chmod 775 /opt/tomcat/bin/catalina.sh

RUN chown root:root /opt/tomcat/bin/catalina.sh

RUN cp -r /tmp/webapps/* /opt/tomcat/webapps/

ENV JAVA_OPTS ""

EXPOSE 8282

CMD sh /opt/tomcat/bin/catalina.sh $JAVA_OPTS && touch /opt/tomcat/logs/webapp.log && tail -f /opt/tomcat/logs/webapp.log

server.xml:

<GlobalNamingResources>
   <Resource
      auth = "Container"
      driverClassName = "com.mysql.jdbc.Driver"
      type = "javax.sql.DataSource"
      global = "jdbc/webapp"

      initialSize = "0"
      maxActive = "10"
      maxIdle = "5"
      maxWait = "5000"
      minIdle = "0"
      timeBetweenEvictionRunsMillis = "34000"
      minEvictableIdleTimeMillis = "55000"

      testOnBorrow = "true"
      testWhileIdle = "true"
      testOnReturn = "false"
      validationQuery = "SELECT 1 FROM dual"
      validationInterval = "30000"
      removeAbandoned = "true"
      removeAbandonedTimeout = "10"

      name = "jdbc/webapp"
      username = "${db.username}"
      password = "${db.password}"
      url = "jdbc:mysql://${db.url}:${db.port}/webapp?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8"
</GlobalNamingResources>

Идеально. Обратите внимание, что JAVA_OPTS также работает в официальном образе докера Tomcat (hub.docker.com/_/tomcat) точно так же. Так что не нужно создавать Dockerfile только для этого.

nharrer 31.10.2020 13:38

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