Tomcat和Docker -如何在运行catalina.sh?后执行shell脚本

tgabmvqs  于 8个月前  发布在  Docker
关注(0)|答案(1)|浏览(77)
背景:

我试图运行一个由Tomcat和Docker支持的网站。但是,我需要替换database.properties文件中的一行,以便连接到MySQL容器。

我做了什么:

docker-compose.yaml

version: '3.8'

services:
  tomcat-web:
    build:
      context: .
      dockerfile: ./Dockerfile.dev
    ports:
      - 8800:8080

字符串
Dockerfile.dev

FROM tomcat:8.0-alpine

WORKDIR /usr/local/tomcat

# Copy a shell script and make it executable
COPY --chmod=0755 startup.sh /usr/local/tomcat/bin/startup.sh

# Clean '/usr/local/tomcat/webapps/' in order to allow tomcat to expand web.war 
RUN rm -rf /usr/local/tomcat/webapps/*

COPY target/web.war /usr/local/tomcat/webapps/ROOT.war

EXPOSE 8080

CMD ["sh", "/usr/local/tomcat/bin/startup.sh"]


删除/usr/local/tomcat/webapps/*中的所有内容是由https://stackoverflow.com/a/32095790/14418391建议的。
startup.sh(在database.properties中更改一行并运行catalina.sh):

# Changing port (from port 3306 to port 3311) in database.properties 
DB_CONFIG_FILE=/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/database.properties
MYSQL_CONTAINER_PORT=3311

sed -i 's~^database.url=jdbc:mysql://127.0.0.1/database_name.*database.url=jdbc:mysql://127.0.0.1:3311/database_name~' $DB_CONFIG_FILE

sh /usr/local/tomcat/bin/catalina.sh run


database.properties

database.url=jdbc:mysql://127.0.0.1/database_name

问题:

网站的docker容器成功运行,但我发现database.properties保持不变

期望和问题:

database.properties(将端口修改为3311):

database.url=jdbc:mysql://127.0.0.1:3311/database_name


但是,要实现这一点,我是否应该在sed命令之前运行catalina.sh,以允许catalina.sh扩展ROOT.WAR,如下所示?

sh /usr/local/tomcat/bin/catalina.sh run

# Changing port (from port 3306 to port 3311) in database.properties 
DB_CONFIG_FILE=/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/database.properties
MYSQL_CONTAINER_PORT=3311

sed -i 's~^database.url=jdbc:mysql://127.0.0.1/database_name.*database.url=jdbc:mysql://127.0.0.1:3311/database_name~' $DB_CONFIG_FILE


谢谢你,你的帮助非常感谢。

i7uaboj4

i7uaboj41#

要能够在database.properties中更改database.url,请将其更改为:

database.url=jdbc:mysql://127.0.0.1/database_name

字符串

database.url=jdbc:mysql://%%MYSQL_HOST%%/database_name


与此同时,Dockerfile.dev中引入了一些小的变化:

FROM tomcat:9.0-alpine

WORKDIR /usr/local/tomcat

RUN apk update && apk add \ 
  zip \
  sed

# Add web.war and extract it under a tomcat directory
ADD sources/ship-web/target/web.war /tmp/ROOT.war
RUN unzip -o /tmp/ROOT.war -d /usr/local/tomcat/webapps/ROOT

# Copy application configurations
COPY ./docker/config /usr/local/tomcat/config-templates

# Copy the startup script and make it executable
COPY --chmod=0755 startup.sh /usr/local/tomcat/bin/startup.sh

EXPOSE 8080

CMD ["sh", "/usr/local/tomcat/bin/startup.sh"]


docker-compose.yaml中,环境变量包括:

version: '3.8'

services:
  tomcat-web:
    build:
      context: .
      dockerfile: ./Dockerfile.dev
    env_file:
      - db.env
    ports:
      - 8800:8080


这就是db.env的内部结构:

MYSQL_HOST=mysql
MYSQL_PORT=3306


MYSQL_HOST的值取决于mysql服务名称,该名称在docker-compose. yaml中定义。
启动脚本负责更改database.url

#!/bin/sh

dbConfigTemplate=/usr/local/tomcat/config-templates/database.properties
dbConfigFile=/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/database.properties

cp $dbConfigTemplate $dbConfigFile

sed -i "s/%%MYSQL_HOST%%/$MYSQL_HOST:$MYSQL_PORT/g" $dbConfigFile

sh /usr/local/tomcat/bin/catalina.sh run

相关问题