Docker Compose - Flyway - 无法从DataSource获取Jdbc连接

时间:2016-10-26 17:02:11

标签: java docker docker-compose dockerfile flyway

我正在努力在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 |错误:无法从用户'user'的DataSource(jdbc:mysql:// mysqldb:3306 / base)获取Jdbc连接:Host '172.18.0.4'不允许连接到此MySQL服务器

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

错误:无法从用户'user'的DataSource(jdbc:mysql:// mysqldb:3306 / base)获取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无法连接到数据库,为什么主机会在每次通话时更改,你能帮我吗?

谢谢! :)

1 个答案:

答案 0 :(得分:0)

问题

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

可能的解决方案?

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

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

Docker Networks而非Container Links

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