我尝试使用docker-compose连接我的springboot应用程序的容器和mysql映像的容器,但是当我运行docker-compose up
时,我的终端启动了一个循环,它启动了spring应用程序,尝试连接MySQL容器,失败并继续尝试。我得到的错误是com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链路故障
停靠器合成文件:
version: '3.8'
services:
mysqldb:
image: mysql
platform: linux/x86_64
env_file: ./.env
restart: always
environment:
- MYSQL_ROOT_PASSWORD=$MYSQLDB_ROOT_PASSWORD
- MYSQL_DATABASE=$MYSQLDB_DATABASE
ports:
- $MYSQLDB_LOCAL_PORT:$MYSQLDB_DOCKER_PORT
volumes:
- db:/var/lib/mysql
app:
depends_on:
- mysqldb
build: .
restart: always
env_file: ./.env
ports:
- $APP_LOCAL_PORT:$APP_DOCKER_PORT
environment:
- DB_HOST=mysqldb
- DB_USER=$MYSQLDB_USER
- DB_PASSWORD=$MYSQLDB_ROOT_PASSWORD
- DB_NAME=$MYSQLDB_DATABASE
- DB_PORT=$MYSQLDB_DOCKER_PORT
stdin_open: true
tty: true
volumes:
db:
.环境:
MYSQLDB_USER=root
MYSQLDB_ROOT_PASSWORD=12345678
MYSQLDB_DATABASE=dronefeederdb
MYSQLDB_LOCAL_PORT=3306
MYSQLDB_DOCKER_PORT=3306
APP_LOCAL_PORT=8080
APP_DOCKER_PORT=8080
Application.yaml:
server:
port: 8080
spring:
datasource:
username: ${DB_USER}
password: ${DB_PASSWORD}
url: jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
jpa:
hibernate:
ddl-auto: update
show-sql: true
open-in-view: false
#https://ia-tec-development.medium.com/lombok-e-spring-data-jpa-142398897733
security.user:
name: dronefeeder
password: dronefeeder
#https://www.baeldung.com/spring-boot-security-autoconfiguration
resilience4j.circuitbreaker:
configs:
default:
waitDurationInOpenState: 10s
failureRateThreshold: 10
#instances:
#estudantes:
#baseConfig: default
停靠文件:
FROM openjdk:11.0-jdk as build-image
WORKDIR /app
COPY . .
RUN ./mvnw clean package -DskipTests
FROM openjdk:11.0-jre
COPY --from=build-image /app/target/*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]
存储库链接:https://github.com/julia-baptista/dronefeeder/tree/docker-configuration
2条答案
按热度按时间qaxu7uf21#
我认为问题是您的应用程序在Application.yaml属性文件中使用了localhost作为SQL URL。由于您的应用程序自己运行在一个容器上,它试图查看容器的localhost,而您的SQL服务器在另一个容器中,具有自己的localhost。Docker容器中的Localhost不引用主机,它们指的是容器本身内的本地主机。
host.docker.internal
不应使用localhost,您需要使用sql continainer url。
最快的选择是使用
host.docker.internal
而不是localhost,但这不是最好的。另一个快速的选择是在同一个Docker网络上运行两个容器。在您的合成文件中以与卷相同的方式定义它。然后将每个容器设置为该网络。请参见Networking in Compose。然后您可以设置SQL url以使用SQL容器名称而不是localhost。因此,这个..
url: jdbc:mysql://localhost:3306/dronefeederdb
将变为url: jdbc:mysql://mysql/dronefeederdb
这两个选项都不可靠,因为您要在应用程序属性文件中硬编码容器名称。更好的解决方案是在您的webApp映像中包含一个环境变量,该变量可以接受指向SQL服务器的URL。然后,您可以在运行容器时或在您的合成文件(Environment variables in Compose)中提供SQL位置。这样,SQL服务器就可以位于任何位置。
eimct9ow2#
您需要在
app
定义块中添加一个depends on:
语句,以使docker compose在数据库启动之前不 Boot 应用程序。请查看以下文档:Docker Compose Startup Order