Docker化Liquibase无法连接Docker化ScyllaDB,报连接创建失败错误
解决Liquibase Docker容器连接ScyllaDB的失败问题
问题核心
Docker容器内的localhost指向容器自身,而非宿主机。你的liquibase容器尝试连接localhost:9041,实际是在访问容器内部的端口,而非宿主机上运行的ScyllaDB服务。
具体解决方案
方案1:ScyllaDB与Liquibase在同一Docker网络(推荐)
如果你的ScyllaDB也是通过Docker运行,将其加入同一个docker-compose网络,直接用服务名替代localhost:
- 修改
liquibase.properties中的url:
url: jdbc:cassandra://scylladb:9041/mykeyspace
- 在
docker-compose.yml中添加ScyllaDB服务(如果尚未配置),确保两者共享同一网络:
version: '3' services: scylladb: image: scylladb/scylla:latest container_name: scylladbcontainer ports: - "9041:9042" # 确认宿主机9041映射到容器默认端口9042 volumes: - scylladb_data:/var/lib/scylla liquibase: image: liquibase/liquibase:4.1.1 container_name: liquibasecontainer volumes: - ./changelogs:/liquibase/changelogs - ./liquibase.properties:/liquibase/liquibase.properties - /home/asif/Liquibase/liquibase-4.1.1/lib:/liquibase/lib command: ["--defaultsFile=/liquibase/liquibase.properties", "update"] depends_on: - scylladb # 确保ScyllaDB启动后再运行Liquibase volumes: scylladb_data:
方案2:ScyllaDB运行在宿主机或外部网络
如果ScyllaDB直接运行在宿主机,或者不在同一Docker网络,通过以下方式处理:
- 方式A:使用宿主机IP地址
找到宿主机的局域网IP(如192.168.1.100),修改liquibase.properties的url:url: jdbc:cassandra://192.168.1.100:9041/mykeyspace - 方式B:使用host网络模式
在docker-compose.yml的liquibase服务中添加network_mode: host,让容器直接使用宿主机网络,此时localhost会指向宿主机:services: liquibase: image: liquibase/liquibase:4.1.1 container_name: liquibasecontainer network_mode: host volumes: - ./changelogs:/liquibase/changelogs - ./liquibase.properties:/liquibase/liquibase.properties - /home/asif/Liquibase/liquibase-4.1.1/lib:/liquibase/lib command: ["--defaultsFile=/liquibase/liquibase.properties", "update"]
额外检查项
- 确认ScyllaDB的端口映射正确:宿主机的9041端口确实映射到ScyllaDB容器的9042端口(ScyllaDB默认端口为9042)。
- 验证JDBC驱动:确保挂载的
/liquibase/lib目录下包含正确版本的Simba Cassandra JDBC驱动jar包,且驱动类名com.simba.cassandra.jdbc42.Driver与jar包匹配。
内容的提问来源于stack exchange,提问作者user21236160
相关产品推荐
相关产品推荐

