【问题标题】:catalina.sh system variable from docker-compose environments来自 docker-compose 环境的 catalina.sh 系统变量
【发布时间】:2019-01-07 16:07:44
【问题描述】:

我有以下问题。 我想从 docker-compose.yml 文件中描述的环境变量中设置一些 JAVA_OPTS,以便将它们用于我的 tomcat

context.xml

示例:

docker-compose.yml

services:
  myapp:
    build: myapp
    container_name: myapp
    environment:
      - DBURL=192.168.7.17
      - DBPORT=3306
      - DBUSERNAME=test
      - DBPASSWORD=test

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/dbschema"
        username="${db_username}"
        password="${db_password}"
        url="jdbc:mysql://${db_url}:${db_port}/dbschema?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8"
    />

按照一些 tomcat 指南,我发现系统变量必须设置到 catalina.sh 脚本或 setenv.sh 脚本中。

所以,我的 catalina.sh 文件包含这一行:

JAVA_OPTS="$JAVA_OPTS -Ddb_url=$DBURL -Ddb_port=$DBPORT -Ddb_username=$DBUSERNAME -Ddb_password=$DBPASSWORD"

但是,从容器中执行ps aux | grep java,我有:

root        26  6.5 13.8 5770472 1120204 ?     Sl   09:04   1:38 /usr/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Ddb_url= -Ddb_port= -Ddb_username= -Ddb_password= -Djava.endorsed.dirs=/opt/tomcat/endorsed -classpath /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start

应用的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/

EXPOSE 8282

CMD service tomcat start && touch /opt/tomcat/logs/myapp.log && tail -f /opt/tomcat/logs/myapp.log

更新 2

我试过了:

docker-compose.yml

services:
  myapp:
    build:
      context: myapp
      args:
            db_url: 192.168.7.17
            db_port: 3306
            db_username: eudata
            db_password: eudata
    container_name: myapp

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/

ARG db_url
ARG db_port
ARG db_username
ARG db_password

ENV db_url ${db_url}
ENV db_port ${db_port}
ENV db_username ${db_username}
ENV db_password ${db_password}

EXPOSE 8282

CMD service tomcat start && touch /opt/tomcat/logs/myapp.log && tail -f /opt/tomcat/logs/myapp.log

我已将以下 setenv.sh 文件添加到 tomcat/bin 文件夹中:

echo "I'm in setenv.sh"

JAVA_OPTS="$JAVA_OPTS -Ddb_url=$db_url -Ddb_port=$db_port -Ddb_username=$db_username -Ddb_password=$db_password"

export JAVA_OPTS

但什么都没有。如果我尝试像这样将环境变量打印到 setenv.sh 中:

echo "Environment variables"

env

JAVA_OPTS="$JAVA_OPTS -Ddb_url=$db_url -Ddb_port=$db_port -Ddb_username=$db_username -Ddb_password=$db_password"

export JAVA_OPTS

我看不到任何设置的变量(db_url、db_port、db_username 或 db_password)。

更新 3

我是这样走的:

我有一个这样的 docker-compse.yml:

services:
  myapp:
    build: myapp
    container_name: myapp
    environment:
      - JAVA_OPTS=-Djdbc.url=192.168.7.17 -Djdbc.port=3306 -Djdbc.username=test -Djdbc.password=test

我的server.xml

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

      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/myapp"
      username="${jdbc.username}"
      password="${jdbc.password}"
      url="jdbc:mysql://${jdbc.url}:${jdbc.port}/interaction_server?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8"
</GlobalNamingResources>

context.xml

<Context>
    <ResourceLink
        name="jdbc/myapp"
        global="jdbc/myapp"

        auth="Container"

        type="javax.sql.DataSource"
    />
</Context>

但我有以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myAppServiceImpl': Invocation of init method failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
....
Caused by: java.sql.SQLException: Illegal connection port value '${jdbc.port}'
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)....

有人可以帮助我吗?谢谢。

【问题讨论】:

  • 你可以进入容器的bash。并通过执行envecho $DBUSERNAME检查环境变量是否设置正确
  • 是的,echo $DBUSERNAME 打印 test
  • 我的猜测是他无法替换任何环境变量,包括$JAVA_OPTS。您是否已经尝试过使用 setenv.sh 文件做同样的事情?
  • 你能解决这个问题吗?
  • @DavidMaes 请参阅编辑中的更新 2。谢谢

标签: java docker tomcat environment-variables catalina


【解决方案1】:

以这种方式工作:

docker-compose.yml

services:
  myapp:
    build: myapp
    container_name: myapp
    environment:
      - JAVA_OPTS= -Ddb.url=192.168.7.17 -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/myapp.log && tail -f /opt/tomcat/logs/myapp.log

server.xml

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

      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/myapp"
      username="${db.username}"
      password="${db.password}"
      url="jdbc:mysql://${db.url}:${db.port}/myapp?useUnicode=true&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8"
</GlobalNamingResources>

【讨论】:

  • 为我工作!谢谢
猜你喜欢
  • 2015-06-17
  • 1970-01-01
  • 2022-01-01
  • 2018-02-03
  • 2019-02-25
  • 2022-06-11
  • 1970-01-01
  • 2015-09-21
  • 2022-11-08
相关资源
最近更新 更多