我正在尝试在应用程序服务中设置一个springbootapi和mysql容器。这是我正在使用的docker compose文件:
version: '3.8'
services:
mysql:
image: mysql:8
container_name: mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=${__dc__MYSQL_ROOT_PASSWORD}
- MYSQL_USER=${__dc__MYSQL_USERNAME}
- MYSQL_PASSWORD=${__dc__MYSQL_PASSWORD}
- MYSQL_DATABASE=${__dc__MYSQL_DATABASE}
thesisapi:
image: ${__dc__IMAGE}
container_name: thesisapi
restart: always
ports:
# Azure Web App exposes port 80
- 80:${__dc__SERVER_PORT}
depends_on:
- mysql
environment:
- SERVER_PORT=${__dc__SERVER_PORT}
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/${__dc__MYSQL_DATABASE}
- SPRING_DATASOURCE_USERNAME=${__dc__MYSQL_USERNAME}
- SPRING_DATASOURCE_PASSWORD=${__dc__MYSQL_PASSWORD}
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
- SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MySQL5InnoDBDialect
注1:我在本地运行了上面的docker compose,它可以完美地工作。
注2:将文件上载到应用程序服务时,将使用实际值而不是变量,即${foo}。
图片下载正常。mysql服务器启动并说它在等待连接,但是我的应用程序失败了几次,直到mysql服务准备就绪。从我在ms文档中看到的情况来看, depends_on
被忽略。
几次失败后,我的api启动了,但由于某种原因,应用程序服务决定停止容器并重试。然后它又做同样的事情,一次又一次,以此类推。。。我已经试了几天来让它工作,这让我很紧张。
我也有一个前端应用程序的形象,我上传到一个应用程序服务,但它没有依赖于其他服务,并启动,可以使用。
我收集的日志:
INFO 1 --- [ task-1] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
INFO 1 --- [ task-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
ERROR 1 --- [ task-1] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
...
WARN 1 --- [ task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata : Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
...
INFO 1 --- [ task-1] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 5000 (http) with context path '/api'
INFO 1 --- [ main] DeferredRepositoryInitializationListener : Triggering deferred initialization of Spring Data repositories…
INFO 1 --- [ task-1] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
INFO 1 --- [ task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
INFO 1 --- [ main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
INFO 1 --- [ main] my.app.MyApplication : Started MyApplication in 25.648 seconds (JVM running for 28.112)
INFO - Stopping site bsdeploydev3api because it failed during startup.
更新
所以我放弃了让我的应用程序和mysql容器同时运行,而是为mysql创建了一个专用的azure资源,名为 Azure Database for MySQL server
.
一切都设置完成后,我的应用程序仍然无法连接到数据库,这次的问题是:
java.sql.sqlexception:服务器时区值“协调世界时”无法识别或表示多个时区。如果要利用时区支持,则必须配置服务器或jdbc驱动程序(通过“servertimezone”配置属性)以使用更具体的时区值。
为了解决这个问题,我必须 ?serverTimezone=UTC
在连接字符串中。在那之后它就开始工作了。
现在我想知道以下事情:
当我在本地运行上述docker文件时,我没有遇到这个问题。我想如果mysql服务器和试图连接到它的应用程序在同一个系统上,就不需要设置这个查询参数。
这是否也是部署到服务器的容器的问题 App Service
? 实际上,他们生活在同一台机器上,我认为他们的行为应该和本地人一样。
所以,如果有人对此有见解,那就太好了。
2条答案
按热度按时间rjjhvcjd1#
我在问答中回答了你的问题。要点是
depends_on
在多容器应用程序上不支持,它将被忽略。我建议删除对mysql映像的启动依赖。bvuwiixz2#
不知道你是否还在寻找答案,但我补充说
entrypoint
在api中按以下方式:entrypoint: ["./wait_for.sh", "db:3306", "-t", "3600", "--", "execute", "api"]
在这里./wait_for.sh
是从https://github.com/vishnubob/wait-for-itdb:3306
mysql数据库运行在3306上吗?我的api依赖于它吗最后两个参数是执行api的命令行。
下面是我的docker文件。