我有一个执行基本CRUD操作并使用MongoDB进行数据持久化的Go应用。
我正在使用Mongo Atlas连接字符串将应用程序连接到MongoDB,当我在本地开发机上运行应用程序时,一切正常。但是,当我将所有内容推送到docker容器时,在docker-compose工作流程中,我开始收到此错误:
server selection error: server selection timeout, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: app-test-shard-00-00-zfzs6.mongodb.net:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : x509: certificate signed by unknown authority }, { Addr: app-test-shard-00-01-zfzs6.mongodb.net:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : x509: certificate signed by unknown authority }, { Addr: app-test-shard-00-02-zfzs6.mongodb.net:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : x509: certificate signed by unknown authority }, ] }
这是我的docker-compose.yml外观:
services:
redis:
image: redis
restart: always
app:
image: docker.pkg.github.com/<user>/<project>/<image>:latest
ports:
- 80:8080
environment:
- APP_ENV=docker
- GIN_MODE=release
depends_on:
- redis
restart: on-failure
这是我的连接字符串的外观:mongodb://user:[email protected]:27017,app-test-shard-00-01-zfzs6.mongodb.net:27017,app-test-shard-00-02-zfzs6.mongodb.net:27017/test?ssl=true&replicaSet=app-test-shard-0&authSource=admin&retryWrites=true&w=majority
我已经检查了this问题和其他几个问题,但似乎都没有解决这个问题。
我还检查了docker的网络配置,我正在使用网桥驱动程序,该驱动程序应允许访问外部应用程序(例如Mongo Atlas)
Go版本:1.13
Mongo驱动程序:mongodb / mongo-go-driver v1.2.0
Dockerfile:
FROM golang:alpine as builder
WORKDIR /build
COPY . .
RUN apk add git openssh build-base
RUN git config --global url."[email protected]:".insteadOf "https://github.com/"
COPY keys/id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
RUN ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts
ENV GOPRIVATE=github.com/contributor-org
RUN go build
FROM alpine
WORKDIR /org
COPY --from=builder /build/app .
COPY config/*.yml config/
RUN mkdir -p /var/log
CMD ["./app"]
问题似乎与证书验证有关。您有两种选择:-将自签名证书添加到CA。-跳过验证。
如果要跳过自签名证书验证,则必须将ClientOptions
结构设置修改为true
ClientOptions.SSLInsecure
变量。