У меня проблема с подключением Api к базе данных MySQL, работающей в контейнерах. У меня есть Dockerfile для Golang Api:
FROM golang:latest
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
WORKDIR /app/bin
EXPOSE 8080
RUN go run ./../cmd/web/
Я обычно соединяюсь с базой данных в приложении, используя базу данных / sql:
dsn = "user1:pass@tcp(wpmysql:3306)/wp?parseTime=true"
db, err := sql.Open("mysql", dsn)
My docker -compose.yml :
version: '3'
services:
db:
image: mysql:5.7
container_name: ${MYSQL_CONTAINER_NAME}
ports:
- 3306:3306
command: --init-file /usr/src/app/init.sql
volumes:
- ./init.sql:/usr/src/app/init.sql
environment:
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASS}
- MYSQL_DATABASE=${MYSQL_DB}
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
networks:
- fullstack
web:
container_name: wpapi
build: .
ports:
- 8080:8080
restart: on-failure
volumes:
- .:/usr/src/app/
depends_on:
- db
networks:
- fullstack
networks:
fullstack:
driver: bridge
В том же каталоге, что и docker -compose.yml, находится файл .env:
DB_PASSWORD=pass
MYSQL_PORT=3306
MYSQL_USER=user1
MYSQL_PASS=pass
MYSQL_DB=wp
MYSQL_CONTAINER_NAME=wpmysql
После звонка рекомендует:
$ docker-compose up -d db
$ docker-compose build web
I получить ошибку ERROR main.go:46: dial tcp: lookup wpmysql on 37.8.214.2:53: no such host
. Список контейнеров выглядит так:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fbaf67df5bf 2778fcda2046 "/bin/sh -c 'go run …" 14 seconds ago Up 13 seconds 8080/tcp mystifying_shannon
7f6c76cc9c4f mysql:5.7 "docker-entrypoint.s…" 40 minutes ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp wpmysql
Более того, когда я пытаюсь подключиться в приложении с помощью dsn = "user1:pass@tcp(localhost:3306)/wp?parseTime=true"
или dsn = "root:pass@tcp(localhost:3306)/wp?parseTime=true"
, я получаю еще одну ошибку: dial tcp 127.0.0.1:3306: connect: connection refused
, хотя я могу go в контейнер (* 1023) *) и sign in
с root
и user1
учетными данными