簡體   English   中英

Docker撰寫(v2)UnkownHostException

[英]Docker compose (v2) UnkownHostException

使用Docker Compose並嘗試將Spring Boot Web應用程序容器與mysql容器鏈接時,出現“ java.net.UnkownHostException:mysql:未知錯誤”。

docker-compose.yml更新#1

version: '2'

services:
web:
depends_on:
- db
image: thomptr/rest-services-ui:latest
ports:
- "9000:9000"
links:
- "db:database"
restart: always
environment:
SPRING_PROFILES_ACTIVE: dev
envTarget: dev

db:
image: mysql:5.7
ports:
- "3307:3306"
volumes:
- "/home/trevor/softwareDev/mySql/dump:/docker-entrypoint-initdb.d"
environment:
MYSQL_ROOT_PASSWORD: legion03
MYSQL_DATABASE: dev
MYSQL_USER: dbuser
MYSQL_PASSWORD: legion03

application-dev.properties更新#1

spring.profiles.active=dev
server.contextPath=/restservices
server.port: 9000

spring.datasource.initialize=false
spring.datasource.platform=mysql
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://database:3306/dev

spring.datasource.username=dbuser
spring.datasource.password=legion03;
hibernate.level.logging=debug

spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

來自/ dockercompose_web_1容器的日志

 2016-07-01 04:17:24.119 ERROR 1 --- [ost-startStop-1] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.
com.mysql.jdbc.exceptions.jdbc4.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.
Caused by: java.net.UnknownHostException: mysql: unknown error
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)

更新#2 Nguyen Sy Thanh Son建議的方法是正確的。 我的解決方案使用公共的wait-for-it.sh腳本。 在這里查看我的解決方案: https : //github.com/thomptr/DockerDemo

web容器在mysql容器啟動之前啟動時,將發生此錯誤。

為了解決此問題,我認為您應該將腳本添加到web圖像的entrypont.sh中,如下所示

host="db"
password="$MYSQL_ROOT_PASSWORD" #mysql root password

until mysql -h "$host" -uroot -p$password; do
  >&2 echo "MYSQL is unavailable - sleeping"
  sleep 1
done

>&2 echo "MYSQL is up - executing command"

# start your app here

上面的腳本將等到mysql啟動后再運行該應用程序

並且您的應用程序的Dockerfile應該包含:

# run app
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

我相信這個錯誤是由於第一個容器不知道誰是數據庫。 從容器A到容器B的鏈接不會修改兩個容器中的/ etc / hosts。

實現此目標的另一種方法是使用別名。 您應該在這里找到所需的所有信息

https://docs.docker.com/compose/compose-file/#aliases

並修改spring參數:

spring.datasource.url=jdbc:mysql://<whatever alias you choose for db>:3306/dev

請讓我知道是否可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM