下面是我的 docker-compose 檔案和我的 application.yml 檔案。我正在覆寫 docker-compose 檔案中的 mysql jdbc url。
為什么我通過命令列運行我能夠連接到在 docker 實體上運行的資料庫。
mysql -uroot -proot -h127.0.0.1 -P3309
當我執行 docker-compose up 時,出現以下錯誤。Spring boot docker 實體無法連接到mysqldb 的docker 實體。你能幫我理解可能是什么問題嗎?
reco-tracker-docker_1 | Caused by: java.lang.RuntimeException: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, "jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
reco-tracker-docker_1 | at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:110) ~[HikariCP-4.0.3.jar!/:na]
reco-tracker-docker_1 | at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:331) ~[HikariCP-4.0.3.jar!/:na]
reco-tracker-docker_1 | at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:114) ~[HikariCP-4.0.3.jar!/:na]
docker-compose.yml
version: '3.8'
services:
mysqldb-docker:
image: 'mysql:8.0.27'
restart: 'unless-stopped'
ports:
- "3309:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=reco-tracker-dev
env_file:
- ./.env
volumes:
- mysqldb:/var/lib/mysql
reco-tracker-docker:
image: 'reco-tracker-docker:latest'
ports:
- "8083:8083"
environment:
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
- SPRING_DATASOURCE_URL="jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
depends_on: [mysqldb-docker]
volumes:
mysqldb:
應用程式.yml
server:
port: 8083
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/reco-tracker
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
generate-ddl: true
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
================================ 更新
在評論區用 [@the-fool] 發表我的討論,
- 我修改了檔案,以便 mysql db 的主機和容器埠相同,以避免任何混淆。
- 我還更新了從環境傳遞的 spring 資料源 url,即使它覆寫了 application.yml 中已有的那個。
- 我使用“docker-compose down --rmi all”洗掉了影像和卷,以便它洗掉容器和卷。(我之前映射了一個不同的卷,這導致了 mysqldb 創建資料庫的問題)
現在可以使用了!!!
應用程式.yml
server:
port: 8083
spring:
datasource:
username: root
password: root
url: ${SPRING_DATASOURCE_URL}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
generate-ddl: true
show-sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
Dockerfile.yml
FROM openjdk:17
ARG JAR_FILE="*.jar"
COPY target/${JAR_FILE} reco-tracker.jar
EXPOSE 8083
ENTRYPOINT ["java", "-jar","reco-tracker.jar"]
docker-compose.yml
version: '3.8'
services:
mysqldb-docker:
image: 'mysql:8.0.27'
restart: 'unless-stopped'
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=reco-tracker
volumes:
- mysqldb:/var/lib/mysql
reco-tracker-docker:
image: 'reco-tracker-app:v2'
ports:
- "8083:8083"
environment:
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
- SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb-docker:3306/reco-tracker
depends_on: [mysqldb-docker]
volumes:
mysqldb:
uj5u.com熱心網友回復:
您的問題是您正在嘗試訪問已發布埠上的資料庫。您正在使用映射 3309:3306 的 3009。這不起作用。您無法更改網路內容器的埠。如果要通過 docker 網路連接,則需要使用 3306。3309 只能從主機系統獲得。
至少在這部分似乎是錯誤的。(似乎雙引號可能存在??問題,我會參考完整的字串或不是全部。)
environment:
- SPRING_DATASOURCE_URL="jdbc:mysql://mysqldb-docker:3309/reco-tracker-dev"
在您的 spring 配置中,您使用了正確的埠,但在那里您使用 localhost 作為資料庫主機,這似乎也是錯誤的。
spring:
datasource:
url: jdbc:mysql://localhost:3306/reco-tracker
我不太了解java,所以我不能告訴你它會如何表現。如果以前的 env var 會覆寫它。但就目前而言,這兩種設定都有些不正確。
我可以想象你可以通過做這樣的事情來解決它。
environment:
# fix the port here
SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb-docker:3306/reco-tracker-dev
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: root
spring:
datasource:
# Use the env vars in the spring config
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
還要確保您的資料庫命名是一致的。他們在您的帖子中似乎有點不一致。請記住,第一次啟動 mysql 容器時使用的名稱存盤在卷中。因此,要么使用您當時使用的名稱,要么洗掉該卷以使其創建新資料庫,這將導致您丟失存盤的資料。所以要小心你選擇的選項。
uj5u.com熱心網友回復:
你在這里試過 docker "networks" 嗎?如果沒有,則創建一個網路并在相同的網路中運行容器。
在 yaml 中,類似于:
networks:
-myNet
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/396740.html
