Mysql Azure多容器Web应用程序无缘无故地似乎停止了该站点

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

我正在尝试在应用程序服务中设置一个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\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”]#等待足够长的时间来设置数据库服务器并