Mysql Azure多容器Web应用程序无缘无故地似乎停止了该站点
我正在尝试在应用程序服务中设置一个SpringBootAPI,其中包含MySQL容器。这是我正在使用的docker compose文件:Mysql Azure多容器Web应用程序无缘无故地似乎停止了该站点,mysql,spring,azure,docker,azure-web-app-service,Mysql,Spring,Azure,Docker,Azure Web App Service,我正在尝试在应用程序服务中设置一个SpringBootAPI,其中包含MySQL容器。这是我正在使用的docker compose文件: 版本:“3.8” 服务: mysql: 图片:mysql:8 容器名称:mysql 重新启动:始终 环境: -MYSQL\u ROOT\u PASSWORD=${{uuuuuu dc\uuuuuu MYSQL\u ROOT\u PASSWORD} -MYSQL\u USER=${{uuuuu dc\uuuuuu MYSQL\u USERNAME} -MYSQL
版本:“3.8”
服务:
mysql:
图片:mysql:8
容器名称:mysql
重新启动:始终
环境:
-MYSQL\u ROOT\u PASSWORD=${{uuuuuu dc\uuuuuu MYSQL\u ROOT\u PASSWORD}
-MYSQL\u USER=${{uuuuu dc\uuuuuu MYSQL\u USERNAME}
-MYSQL\u PASSWORD=${{uuuuu dc\uuuuuu MYSQL\u PASSWORD}
-MYSQL\u DATABASE=${{uuuuu dc\uuuuuu MYSQL\u DATABASE}
塞萨皮:
图像:${uuuu dc\uuuu image}
集装箱名称:塞萨皮
重新启动:始终
端口:
#Azure Web应用程序公开端口80
-80:${uuuuuu dc\uuuuu服务器\u端口}
取决于:
-mysql
环境:
-服务器\端口=${{uuuuuu dc\ uuuuu服务器\端口}
-SPRING\u数据源\u URL=jdbc:mysql://mysql:3306/${uuuuu dc\uuuuu MYSQL\u数据库}
-SPRING_DATASOURCE_USERNAME=${{uuuuu dc_uuuumysql_USERNAME}
-SPRING_DATASOURCE_PASSWORD=${{uuuuu dc_uuuuumysql_PASSWORD}
-SPRING\u DATASOURCE\u DRIVER\u CLASS\u NAME=com.mysql.cj.jdbc.DRIVER
-SPRING\u JPA\u HIBERNATE\u DDL\u AUTO=更新
-SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialent.mysql5innodbdialent
注1我在本地运行了上面的docker compose,它可以完美地工作
注2将文件上载到应用程序服务时,存在实际值而不是变量,即${foo}
图片下载正常。MySQL服务器启动并说它在等待连接,但我的应用程序失败了几次,直到MySQL服务准备就绪。从我在ms文档中看到的情况来看,dependens\u 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数据库for MySQL server
一切设置完成后,我的应用程序仍然无法连接到数据库,这次问题是:
java.sql.SQLException:服务器时区值“Coordinated Universal time”无法识别或表示多个时区。如果要利用时区支持,必须配置服务器或JDBC驱动程序(通过“serverTimezone”配置属性)以使用更具体的时区值
为了解决这个问题,我必须在连接字符串中设置?serverTimezone=UTC
。在那之后,它开始工作了
现在我想知道以下几件事:
- 当我在本地运行上述docker文件时,我没有遇到这个问题。我假设,如果MySQL服务器和试图连接到它的应用程序位于同一个系统上,则无需设置该查询参数
- 这是否也是部署到
应用程序服务的容器的问题?实际上,他们生活在同一台机器上,我认为他们的行为应该和本地人一样
因此,如果有人对此有见解,那就太好了。我给你的Q&A提问。要点是
依赖于多容器应用程序,它会被忽略。我建议删除MySQL映像上的启动依赖项。我在问答中向您提问。要点是依赖于多容器应用程序,它会被忽略。我建议删除MySQL映像上的启动依赖项。不确定您是否仍在寻找答案,但我已通过以下方式在api中添加了entrypoint
:
入口点:[“/wait_for.sh”、“db:3306”、“-t”、“3600”、“--”、“execute”、“api”]
此处/wait\u for.sh
取自
db:3306
是在3306上运行的mysql数据库,我的api依赖于它
最后两个参数是执行api的命令行
下面是我的docker撰写文件
version: '3.8'
services:
db:
image: mysql
volumes:
- mysql:/var/lib/mysql
environment:
- MYSQL_DATABASE=dbName
- MYSQL_ROOT_PASSWORD=MyRootPassword!
- MYSQL_USER=dbUser_1
- MYSQL_PASSWORD=dbUser_1sPassword!
restart: always
api:
depends_on:
- db
entrypoint: ["./wait_for.sh", "db:3306", "-t", "3600", "--", "execute", "api"] #waiting very long enough to set the db server up and running
image: <my registry url>/api:latest
ports:
- "80:80"
restart: always
volumes:
mysql:
driver: azure_file
driver_opts:
share_name: Azure_Share_Name
storage_account_name: Azure_Storage_Account_Name
storageaccountkey: Azure_Key
版本:“3.8”
服务:
db:
图片:mysql
卷数:
-mysql:/var/lib/mysql
环境:
-MYSQL\u DATABASE=dbName
-MYSQL\u ROOT\u PASSWORD=MyRootPassword!
-MYSQL\u USER=dbUser\u 1
-MYSQL\u PASSWORD=dbUser\u 1sspassword!
重新启动:始终
应用程序编程接口:
取决于:
-分贝
入口点:[“/wait_for.sh”、“db:3306”、“-t”、“3600”、“-”、“execute”、“api”]#等待足够长的时间来设置数据库服务器并运行
图像:/api:最新版本
端口:
- "80:80"
重新启动:始终
卷数:
mysql:
驱动程序:azure_文件
驾驶员选择:
共享\u名称:Azure\u共享\u名称
存储\帐户\名称:Azure\存储\帐户\名称
storageaccountkey:Azure\u密钥
不确定您是否仍在寻找答案,但我已通过以下方式在api中添加了入口点
:
入口点:[“/wait_for.sh”、“db:3306”、“-t”、“3600”、“--”、“execute”、“api”]
此处/wait\u for.sh
取自
db:3306
是在3306上运行的mysql数据库,我的api依赖于它
最后两个参数是执行api的命令行
下面是我的docker撰写文件
version: '3.8'
services:
db:
image: mysql
volumes:
- mysql:/var/lib/mysql
environment:
- MYSQL_DATABASE=dbName
- MYSQL_ROOT_PASSWORD=MyRootPassword!
- MYSQL_USER=dbUser_1
- MYSQL_PASSWORD=dbUser_1sPassword!
restart: always
api:
depends_on:
- db
entrypoint: ["./wait_for.sh", "db:3306", "-t", "3600", "--", "execute", "api"] #waiting very long enough to set the db server up and running
image: <my registry url>/api:latest
ports:
- "80:80"
restart: always
volumes:
mysql:
driver: azure_file
driver_opts:
share_name: Azure_Share_Name
storage_account_name: Azure_Storage_Account_Name
storageaccountkey: Azure_Key
版本:“3.8”
服务:
db:
图片:mysql
卷数:
-mysql:/var/lib/mysql
环境:
-MYSQL\u DATABASE=dbName
-MYSQL\u ROOT\u PASSWORD=MyRootPassword!
-MYSQL\u USER=dbUser\u 1
-MYSQL\u PASSWORD=dbUser\u 1sspassword!
重新启动:始终
应用程序编程接口:
取决于:
-分贝
入口点:[“/wait_for.sh”、“db:3306”、“-t”、“3600”、“-”、“execute”、“api”]#等待足够长的时间来设置数据库服务器并