Docker -составить API и конфигурацию базы данных - PullRequest
0 голосов
/ 19 февраля 2020

У меня проблема с подключением 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 учетными данными

1 Ответ

1 голос
/ 19 февраля 2020

В вашем файле docker есть:

RUN go run ./../cmd/web/

Это попытается собрать И запустить ваш исполняемый файл во время процесса сборки. Сеть fullstack в настоящее время недоступна. Я думаю, что вы, вероятно, хотели использовать:

CMD go run ../cmd/web/

Это установит запуск команды по умолчанию при запуске (т. Е. docker-compose up) контейнера на go run ../cmd/web/. Еще лучше было бы:

RUN go build ../cmd/web/
CMD ../cmd/web/web

Это создаст ваше приложение как часть процесса построения контейнера, а затем установит исполняемый файл, полученный в качестве команды по умолчанию. Преимущество этого состоит в том, что ошибки компиляции становятся очевидными при создании образа (и это означает, что приложение не создается при каждом запуске контейнера).

...