Проблема в том, что ваш код go не может разрешить адрес mysql
, так как он не развернут в файле compose.
Чтобы исправить это, у вас есть два решения:
- Добавьте ваше приложение в файл docker-compose, докеризировав код, если это еще не сделано, и тогда оно сможет подключиться к вашему контейнеру mysql.
- Предоставьте доступ к портам вашего контейнера mysql и измените адрес, используемый в вашем коде go, с
mysql
на localhost:3306
(я вижу, что вы изменили свой compose, и порты открыты, поэтому вам просто нужно изменить адрес в своем коде )
Для первого решения вы можете встроить простое приложение Go в образ Docker, например:
# Build stage
FROM golang:alpine AS build-env
COPY . /go/src/your/project/path
WORKDIR /go/src/your/project/path
RUN apk update && \
apk upgrade && \
<install your deps here if needed>
# Install dep if needed
ENV DEP_VERSION="0.4.1"
RUN curl -L -s https://github.com/golang/dep/releases/download/v${DEP_VERSION}/dep-linux-amd64 -o $GOPATH/bin/dep
RUN chmod +x $GOPATH/bin/dep
RUN dep ensure
# Build your app
RUN go build -o myapp
# Final stage
FROM alpine
WORKDIR /app/myapp
COPY --from=build-env /go/src/your/project/path /app/myapp
ENTRYPOINT ["/app/myapp/myapp"]
Затем добавьте его в свой файл композиции:
version: "3"
services:
mysql:
image: mysql:5.6
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: a
LANG: C.UTF-8
adminer:
image: adminer
ports:
- 8082:8080
myapp:
build: .
depends_on:
- mysql
nginx:
build: ../docker-shared/nginx
ports:
- 443:443
volumes:
- "./nginx_proxy_settings.conf:/etc/nginx/conf.d/nginx_proxy_settings.conf"
volumes:
mysql-data:
И добавьте порт и транспорт к коду вашего приложения:
func main() {
dbConfig := mysql.NewConfig()
dbConfig.User = "root"
dbConfig.Passwd = "a"
dbConfig.Addr = "mysql:3306"
dbConfig.DBName = "websays_prod"
dbConfig.Net = "tcp"
db, err := sql.Open("mysql", dbConfig.FormatDSN())
if err != nil {
panic(err)
}
defer db.Close()
}
Второе решение, если вы не хотите докеризировать свое приложение, это просто изменить код на:
func main() {
dbConfig := mysql.NewConfig()
dbConfig.User = "root"
dbConfig.Passwd = "a"
dbConfig.Addr = "localhost:3306"
dbConfig.DBName = "websays_prod"
dbConfig.Net = "tcp"
db, err := sql.Open("mysql", dbConfig.FormatDSN())
if err != nil {
panic(err)
}
defer db.Close()
}