【发布时间】:2021-06-05 04:29:16
【问题描述】:
我有一个远程 mysql 主机。
我已经创建了一个简单的 Spring Boot 应用程序。
我已经创建了这个项目的 .jar 文件。
我已经从这个 app.jar 创建了一个 docker 镜像
我创建了一个使用此托管的容器。一切正常,但问题是:
它使用我的配置文件中提供的参数。
与类文件中提供的参数一起使用它可以正常工作:
docker run --name app1 -p 8000:8080 app-image:v1
我需要做的是连接到我创建容器时提供的随机主机,而不是链接(或耦合)到这个特定的服务器。
步骤如下:
1.- Dockerfile
FROM openjdk:8
VOLUME /tmp
EXPOSE 8080:8080
ADD ./target/app-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
2.- 创建图像
docker build -t app-image:v1 .
3.- 创建一个容器
docker run --name app1 -p 8000:8080 app-image:v1
工作正常,但使用 DatasourceConfig 中的参数
4.- 我在spring boot app(v2.4.3)中的配置是这样的:
@Configuration
public class DatasourceConfig {
@Bean
public DataSource datasource() {
return DataSourceBuilder.create()
.driverClassName("com.mysql.cj.jdbc.Driver")
.url("jdbc:mysql://mysql-remote.net:8192/test-database")
.username("root")
.password("q")
.build();
}
}
我尝试了几个选项来覆盖默认选项,如下所示:
docker run --name app1 -p 8001:8080 -e MYSQL_USER=root -e MYSQL_PASSWORD=q -e MYSQL_DATABASE=jdbc:mysql://mysql-remote.net:8192/test-database app-image:v1
但我明白了:
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
有什么建议吗?
谢谢
更新 1: 在本地工作我使用这个配置:
@Bean
public DataSource datasource() {
return DataSourceBuilder.create()
.driverClassName("com.mysql.cj.jdbc.Driver")
.url("jdbc:mysql://localhost:3306/test-database?serverTimezone=UTC&CuseLegacyDatetimeCode=false")
.username("root")
.password("q")
.build();
}
我使用此配置创建 docker 映像。据我所知,传递参数应该覆盖这个配置,但没办法。
我用过 Ashok 写的,但是没用。
更新 2(已解决)
在 DatasourceConfig 中添加此代码,使用默认值在本地工作:
@Value("${custom.property.url:jdbc:mysql://localhost:3306/test-database?serverTimezone=UTC&CuseLegacyDatetimeCode=false}")
String url;
@Value("${custom.property.username:root}")
String username;
@Value("${custom.property.password:q}")
String password;
@Bean
public DataSource datasource() {
return DataSourceBuilder.create()
.driverClassName("com.mysql.cj.jdbc.Driver")
.url(url)
.username(username)
.password(password)
.build();
}
}
稍后我像往常一样创建图像并像这样运行容器(覆盖参数并从我的 docker 容器连接到外部 mysql 托管)。我用几个容器测试了这个应用程序,效果很好!!
docker run --name app1 -p 8001:8080 -e custom.property.username=root -e custom.property.password=q -e custom.property.url=jdbc:mysql://localhost:3306/test-database?serverTimezone=UTC&CuseLegacyDatetimeCode=false app-image:v1
谢谢你的帮助!!
【问题讨论】:
-
为什么你有这个类DatasourceConfig而不使用默认?
-
为什么要构建自己的数据源?为什么不使用 JPA 和 env 设置?
-
Spring Boot 2.4.3 版本中的 application.properties 不工作,原因
标签: mysql spring-boot docker dockerfile