为什么应用程序第一次没有启动,而是从第二次启动?

时间:2021-01-05 10:04:08

标签: spring-boot docker

我是 Docker 的新手,我正在尝试对我的应用程序进行 dockerize。我正在使用 MySQL 和 Spring Boot。
当我使用 docker-compose up 时,会发生一些异常:

todoapp-container_1  | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
todoapp-container_1  |  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]
todoapp-container_1  |  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_111]
todoapp-container_1  |  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_111]

还有一点点:

todoapp-container_1  | Caused by: java.net.ConnectException: Connection refused (Connection refused)
todoapp-container_1  |  at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_111]
todoapp-container_1  |  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_111]
todoapp-container_1  |  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_111]

这是我的 docker-compose:

version: '3'
services:
    mysql-container:
        image: mysql:8
        environment:
            - MYSQL_ROOT_PASSWORD=password
            - MYSQL_DATABASE=todo
            - MYSQL_PASSWORD=todo
            - MYSQL_USER=todo
    todoapp-container:
        image: todoapp-service
        ports:
            - 8080:8080
        build:
            context: .
            dockerfile: Dockerfile
        depends_on:
            - mysql-container

和我的 application.properties:

#SERVER
server.port=8080
#MYSQL
spring.datasource.url=jdbc:mysql://mysql-container:3306/todo?createDatabaseIfNotExist=true
spring.datasource.username=todo
spring.datasource.password=todo
spring.jpa.generate-ddl=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
#JACKSON SERIALIZATION FOR NULL FIELDS
spring.jackson.default-property-inclusion=non_null

问题是,如果我第二次运行 docker-compose up,它可以完美无缺地工作,并且可以使用邮递员进行请求。我假设在容器启动的那一刻有问题,我想我必须让 todoapp-container 等到 mysql-container 启动,但我不太确定。

1 个答案:

答案 0 :(得分:0)

您可以使用 depends_on 选项控制服务启动和关闭的顺序。

但是,对于启动,Compose 不会等到容器“准备好”(无论这对您的特定应用程序意味着什么) - 只会等到它运行。

要处理此问题,请将您的应用程序设计为在出现故障后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。

官方documentation中还有其他建议值得一看:)

相关问题