如何在docker compose多容器应用程序中使用gocql连接到bitnami/cassandra?

zz2j4svz  于 2021-06-09  发布在  Cassandra
关注(0)|答案(1)|浏览(368)

我正在尝试构建一个应用程序的简化示例,该应用程序使用用户名和密码身份验证连接到cassandra。为此,我调整了 docker-compose.yml 从https://hub.docker.com/r/bitnami/cassandra/ 具体如下:

  1. version: '2'
  2. services:
  3. cassandra:
  4. image: 'docker.io/bitnami/cassandra:3-debian-10'
  5. ports:
  6. - '7000:7000'
  7. - '9042:9042'
  8. volumes:
  9. - 'cassandra_data:/bitnami'
  10. environment:
  11. - CASSANDRA_SEEDS=cassandra
  12. - CASSANDRA_PASSWORD_SEEDER=yes
  13. - CASSANDRA_PASSWORD=cassandra
  14. backend:
  15. build: .
  16. environment:
  17. - CASSANDRA_USERNAME=cassandra
  18. - CASSANDRA_PASSWORD=cassandra
  19. volumes:
  20. cassandra_data:
  21. driver: local

我的目录结构在哪里

  1. .
  2. ├── Dockerfile
  3. ├── docker-compose.yml
  4. ├── go.mod
  5. ├── go.sum
  6. └── main.go

多阶段 Dockerfile

  1. FROM golang AS builder
  2. WORKDIR /go/src/app/
  3. COPY . .
  4. RUN GO111MODULE=on CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
  5. FROM alpine:latest
  6. RUN apk --no-cache add ca-certificates
  7. WORKDIR /root/
  8. COPY --from=builder /go/src/app/app .
  9. CMD ["./app"]

以及 main.go 尝试使用创建cassandra会话 gocql :

  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "github.com/gocql/gocql"
  6. )
  7. func main() {
  8. cluster := gocql.NewCluster("cassandra")
  9. cluster.Authenticator = gocql.PasswordAuthenticator{
  10. Username: os.Getenv("CASSANDRA_USERNAME"),
  11. Password: os.Getenv("CASSANDRA_PASSWORD"),
  12. }
  13. if _, err := cluster.CreateSession(); err != nil {
  14. log.Fatalf("CreateSession: %v", err)
  15. }
  16. }

用户名和密码都被设置为默认值“cassandra”,如中的“连接到其他容器”示例所示https://hub.docker.com/r/bitnami/cassandra/.
问题是,如果我尝试使用 docker-compose build 然后 docker-compose up ,我得到以下错误:

  1. backend_1 | 2020/11/04 15:10:34 CreateSession: gocql: unable to create session: unable to discover protocol version: dial tcp 172.18.0.3:9042: connect: connection refused

我不明白这里出了什么问题:主机名、端口号、用户名和密码似乎都是正确的。你知道为什么拒绝连接吗?

bjg7j2ky

bjg7j2ky1#

cassandra需要几秒钟来启动并开始接受连接; backend 正在尝试在准备就绪之前连接。你的配置工作正常(对我来说)如果你启动 backend 稍加延迟后(使用 docker-compose start backend ). 修改 backend 重试连接对我来说是可靠的。

  1. for {
  2. _, err := cluster.CreateSession()
  3. if err == nil {
  4. break
  5. }
  6. log.Printf("CreateSession: %v", err)
  7. time.Sleep(time.Second)
  8. }
  9. log.Printf("Connected OK")

日志:

  1. backend_1 | 2020/11/04 17:53:23 CreateSession: gocql: unable to create session: unable to discover protocol version: dial tcp 172.26.0.2:9042: connect: connection refused
  2. backend_1 | 2020/11/04 17:53:24 CreateSession: gocql: unable to create session: unable to discover protocol version: dial tcp 172.26.0.2:9042: connect: connection refused
  3. .......
  4. backend_1 | 2020/11/04 17:53:36 CreateSession: gocql: unable to create session: unable to discover protocol version: dial tcp 172.26.0.2:9042: connect: connection refused
  5. backend_1 | 2020/11/04 17:53:37 Connected OK
展开查看全部

相关问题