azure多容器web应用无缘无故地终止了站点

sigwle7e  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(383)

我正在尝试在应用程序服务中设置一个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 ? 实际上,他们生活在同一台机器上,我认为他们的行为应该和本地人一样。
所以,如果有人对此有见解,那就太好了。

rjjhvcjd

rjjhvcjd1#

我在问答中回答了你的问题。要点是 depends_on 在多容器应用程序上不支持,它将被忽略。我建议删除对mysql映像的启动依赖。

bvuwiixz

bvuwiixz2#

不知道你是否还在寻找答案,但我补充说 entrypoint 在api中按以下方式: entrypoint: ["./wait_for.sh", "db:3306", "-t", "3600", "--", "execute", "api"] 在这里 ./wait_for.sh 是从https://github.com/vishnubob/wait-for-it db:3306 mysql数据库运行在3306上吗?我的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

相关问题