最近在折腾服务器,准备部署halo,使用官方的文档中docker compose部署单实例,外部数据库的方法在Windows下docker一直报错,无法连接数据库
Caused by: org.springframework.r2dbc.connection.init.UncategorizedScriptException: Failed to execute database script
...
Caused by: org.springframework.dao.DataAccessResourceFailureException: Failed to obtain R2DBC Connection
...
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: localhost/127.0.0.1:3306
Caused by: java.net.ConnectException: finishConnect(..) failed: Connection refused
搜索得知Windows下docker无法使用host网络(试了半天发现坑在这等我呢,nnd),故需要更改compose.yaml文件
官方文件中network_mode使用的host,注释掉使用默认,添加端口映射,数据库地址需要填入宿主机本地网络wsl的ip地址填入,这里如果填localhost是容器内部自己的ip,不是宿主机的。
另外需要注意:
若要使用外部数据库,需要使用mysql(而不是mariadb)中sha2认证插件(从文档其他部署方式中看到认证方式,不知道mariadb的native认证行不行,请自己测试)(mysql8.0默认是sha2,目前mariadb11.3不支持)
需要手动创建数据库halo
create database halo; 不然会报错:
io.r2dbc.spi.R2dbcBadGrammarException: Unknown database 'halo'
下面是我改过的compose文件,注释掉了官方的一些语句,加了端口映射,供参考
version: "3"
services:
halo:
image: halohub/halo:2.15
restart: on-failure:3
#network_mode: "host"
ports:
- 8090:8090
volumes:
- ./halo2:/root/.halo2
command:
# 修改为自己已有的 MySQL 配置
- --spring.r2dbc.url=r2dbc:pool:mysql://填本机网络中查看到的wsl的ip地址:3306/halo
- --spring.r2dbc.username=root
- --spring.r2dbc.password=****
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
# 端口号 默认8090
#- --server.port=8090 在yaml文件下打开cmd执行docker-compose up -d