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

问题描述 投票:0回答:1

背景:

我正在尝试运行一个由 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"]

https://stackoverflow.com/a/32095790/14418391

建议删除
/usr/local/tomcat/webapps/*中的所有内容。

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
谢谢您,非常感谢您的帮助。

docker tomcat docker-compose sed tomcat8
1个回答
0
投票
为了能够更改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
    
© www.soinside.com 2019 - 2024. All rights reserved.