我正在尝试运行一个由 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
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
谢谢您,非常感谢您的帮助。
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