Docker Compose - Flyway - 无法从数据源获取 Jdbc 连接

Posted

技术标签:

【中文标题】Docker Compose - Flyway - 无法从数据源获取 Jdbc 连接【英文标题】:Docker Compose - Flyway - Unable to obtain Jdbc connection from DataSource 【发布时间】:2017-03-09 04:01:35 【问题描述】:

我正在准备在 Ubuntu 中使用 Docker Compose 部署微服务和 flyway 服务。 docker-compose.yml 看起来像这样:

version: '2'

services:

mysqldb:
image: mysql:5.6.26
environment:
  MYSQL_USER: user
  MYSQL_PASSWORD: password
  MYSQL_ROOT_PASSWORD: password
  MYSQL_DATABASE: base
ports:
  - "3306:3306"

flyway-service-i:
image: mialk/flyway-service
volumes:
 - "../resources/db/migration:/migrations/ro"
depends_on:
 - mysqldb
links:
 - mysqldb
command: migrate -url=jdbc:mysql://mysqldb:3306/base -user=user -password=password -baselineOnMigrate=true -    locations='filesystem:/migrations'

  service1:
image: my/service
ports:
  - "8080:8080"
links:
 - mysqldb
environment:
  - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/base
  - SPRING_DATASOURCE_USERNAME=user
  - SPRING_DATASOURCE_PASSWORD=password

但是当我运行命令:sudo docker-compose up 时,我有这个消息:

flyway-service-i_1 |错误:无法从数据源 (jdbc:mysql://mysqldb:3306/base) 为用户 'user' 获取 Jdbc 连接:不允许主机 '172.18.0.4' 连接到此 MySQL 服务器

每次我运行命令时,我都会得到一个不同的主机,例如:

错误:无法从数据源 (jdbc:mysql://mysqldb:3306/base) 为用户 'user' 获取 Jdbc 连接:不允许主机 '172.18.0.6'连接到这个 MySQL 服务器

数据库就是这样创建的:

CREATE DATABASE base CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL PRIVILEGES ON base.* To 'user'@'localhost';

ifconfig 命令显示 Docker 的 IP 为 172.17.0.1。

我不知道为什么flyway无法连接到数据库,为什么每次调用主机都会改变,请您帮帮我吗?

谢谢! :)

【问题讨论】:

你用的是什么版本的docker? $ docker version @F*** 我正在使用:版本:1.12.1 API 版本:1.24 谢谢! 【参考方案1】:

问题

在这一行GRANT ALL PRIVILEGES ON base.* To 'user'@'localhost'; 您在localhost 上向用户授予特权,但您的service1flyaway-service-1 服务在各自独立的容器中运行,因此不在localhost 上运行(相对于mysqldb 容器)。如果这些服务mysqldb 容器内运行,那么它们可能会在localhost 上运行。

可能的解决方案?

您可能想尝试使用您授予访问权限的服务/容器的主机名而不是localhost

即: GRANT ALL PRIVILEGES ON base.* To 'user'@'service1';

Docker 网络而不是容器链接

另外,我建议使用 Docker 的新网络功能,而不是旧的容器链接方法。见rationale behind docker compose "links" order

【讨论】:

非常感谢您的回答@F***!但是,如果我在 base.* TO 'user'@'%' IDENTIFIED BY 'password' 上运行 GRANT ALL,它将能够连接,不是吗?谢谢!

以上是关于Docker Compose - Flyway - 无法从数据源获取 Jdbc 连接的主要内容,如果未能解决你的问题,请参考以下文章

无法将docker Spring-Boot应用程序与docker-compose中的mysql容器和flyway连接起来

使用 Docker 和 Jenkins 自动化 Flyway 迁移

Flyway 无法从 Docker-Container 连接到 MySQL

如何在Docker中初始化数据库后启动flyway

Docker Compose - 如何在一个 mysql 容器中引用多个模式

在docker中运行flyway时连接被拒绝