我正在尝试通过Docker服务部署Spring Web应用程序以测试我的项目。服务启动时没有任何问题,但是当我尝试通过主机通过Web应用访问端点时,出现以下错误消息:
不允许主机“ 172.21.0.2”连接到该MySQL服务器
这是我当前的设置:
docker-compose.yml
version: '3'
services:
app:
build:
context: .
dockerfile: app-dockerfile
image: app
ports:
- 8080:80
command: java -Dserver.port:80 -jar app-0.1.0.jar
appdb:
build:
context: .
dockerfile: appdb-dockerfile
image: appdb
app-dockerfile
FROM openjdk:8
WORKDIR /usr/local/bin
COPY ./target/app-0.1.0.jar .
EXPOSE 80/tcp
appdb-dockerfile
FROM mysql:latest
ENV MYSQL_ROOT_HOST=app
ENV MYSQL_DATABASE=appdbinstance
ENV MYSQL_ROOT_PASSWORD=appdbpassword
WORKDIR /docker-entrypoint-initdb.d
COPY ./dbscripts/master.sql .
application.yml
database:
host: appdb
instance: appdbinstance
port: 3306
user: root
password: appdbpassword
到目前为止,我已经尝试过:
->将 MYSQL_ROOT_HOST = app 更改为 MYSQL_ROOT_HOST =%。这行得通,但是我不希望root用户能够从任何主机进行连接。我想将其限制为仅应用容器。
->我检查了绑定地址:
mysqld --verbose --help | grep bind-address
--bind-address=name IP address(es) to bind to. Syntax: address[,address]...,
--mysqlx-bind-address[=name]
bind-address *
mysqlx-bind-address *
据我所知,这应该没问题,因为它允许任何远程主机连接到mysql。
->认为这可能与应用程序配置有关,因此我尝试使用应用程序容器内的mysql CLI工具连接到mysql,但出现了相同的错误消息。
->我运行以下脚本来确保创建了远程root用户(并已创建):
select user, host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | app |
| root | localhost |
+------+-----------+
->我尝试将所有特权授予远程root用户(这不起作用。):
GRANT ALL PRIVILEGES ON appdbinstance.* TO 'root'@'app';
这时,看来根主机环境变量(MYSQL_ROOT_HOST)是问题的症结所在。如果是这种情况,我将不知道如何解决该问题(除了将其设置为%出于安全目的,我不希望这样做)。 最终,我正在尝试设置mysql服务器,使其仅接受来自特定用户(目前为root)的来自应用容器的连接。任何想法都欢迎。