У меня есть следующий код:
func NewConnection(connectionString string) (*sql.DB, error) {
db, err := sql.Open("postgres", connectionString)
if err := db.Ping(); err != nil {
log.Panic(err)
}
return db, err
}
И следующий Dockerfile:
# Build env
FROM golang:alpine AS build
ARG stage
RUN apk update && apk upgrade && \
apk add --no-cache bash git openssh build-base && \
go get -u golang.org/x/vgo
ADD . /src
WORKDIR /src
RUN vgo mod init && vgo install ./...&& vgo build -o service
# Runtime env
FROM alpine
ARG stage
RUN apk update && apk add --no-cache ca-certificates openssl openssl-dev
WORKDIR /app
COPY --from=build /src/${stage}-env.yml /app/
COPY --from=build /src/service /app/
ENV CONFIG_PATH=.
ENTRYPOINT ./service
Моя функция NewConnection извлекает строку подключения Redshift из очереди вместе с некоторыми данными. Все это работает локально, когда я тестирую контейнер postgres. Однако при развертывании службы я получаю следующую ошибку:
panic: pq: parameter "ssl" cannot be changed after server start
Мое соединение содержит ?ssl=true, и оно должно быть SSL, мы подключаемся из сервиса Fargate в AWS, к AWS Redshift и т. д. Поэтому я думаю, что проблема может быть связана с отсутствием зависимостей ssl в моем контейнере Alpine или отсутствием сертификатов или чего-то в этом роде. линии.
@Peter Я переместил эту ошибку, чтобы она обрабатывалась до пинга, и похоже, что это log.Panic(err) в пинге, который вызывает фатальную ошибку.
Не могли бы вы поделиться своей строкой подключения?


Вы можете установить соединение с БД без SSL-шифрования, например:
db, err := sql.Open("postgres", "user=test password=test dbname=test sslmode=disable")
Я понял это, в строке подключения, которую мы использовали, был ssl=true, который работал с библиотекой в nodejs, но в Go это должен быть sslmode=require. Я проверил это и заменил строку.
Вы не проверяете ошибку в sql.Open перед тем, как перейти к проверке связи с базой данных. Что это?