Не удается подключиться к контейнеру MySQL из контейнера Golang - PullRequest
0 голосов
/ 29 октября 2019

У меня есть 2 контейнера: 1 с простой программой golang и 1 с mysql. Я могу запустить оба, но Голанг не может подключиться к MySQL. Я получаю отказ в соединении.

Если я пытаюсь выполнить bash в контейнере mysql и пытаюсь подключиться локально с mysql -u root -p, все работает хорошо. Если на хосте я пытаюсь подключиться к контейнеру с mysql -h 0.0.0.0 -P 10000 -u root -p, все работает хорошо.

Я добавил MYSQL_ROOT_HOST: '%' в docker-compose и bind-address = 0.0.0.0 в mysqld.cnf, но все еще не работает.

Что я делаю не так?

docker-compose

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: docker/web/Dockerfile
    ports:
      - "8081:8081" # http
      - "443:443" # https
    links:
      - db_private
    volumes:
     - ../../../../.:/go
  db_private:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_ROOT_HOST: '%'
    ports:
      - '10000:3306'
    expose:
      - '3306'
    volumes:
      - ./mysql-entry-point.sql:/docker-entrypoint-initdb.d
      - private-db:/var/lib/mysql
      - ./mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
# Names our volume
volumes:
  private-db:

Веб-контейнер Dockerfile

FROM golang:alpine
RUN mkdir /app
ADD . /app/

WORKDIR /app

RUN apk update && apk upgrade && apk add --no-cache bash git openssh

RUN go get github.com/jinzhu/gorm
RUN go get github.com/jinzhu/gorm/dialects/mysql
RUN go get github.com/gin-gonic/gin
RUN go get github.com/gin-contrib/cors


RUN go build -o main .
RUN adduser -S -D -H -h /app appuser
USER appuser
CMD ["./main"]

Файл Голанга

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "net/http"
    "time"
)

var db *gorm.DB

type (
    FooModel struct {
        Id        int64 `gorm:"primary_key"`
        name      string
    }
)

func init() {
    //open a db connection
    var err error
    db, err = gorm.Open("mysql", "user:pwd@(0.0.0.0:10000)/myDB?charset=utf8&parseTime=true")
    if err != nil {
        fmt.Println(err)
        panic("failed to connect database")
    }
    //Migrate the schema
    db.AutoMigrate(&FooModel{})

    db.LogMode(true)
}

// main inits routes
func main() {

    router := gin.Default()

    router.GET("/getExample", getExample)

    router.Run("0.0.0.0:8081")
}


func getExample(c *gin.Context) {

    c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": "bye"})
}

Я копирую mysqld.cnf в контейнер с этим

[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
datadir     = /var/lib/mysql
#log-error  = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
bind-address   = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

1 Ответ

2 голосов
/ 29 октября 2019

Ваше веб-приложение работает в контейнере, что означает, что адрес 0.0.0.0 - это сам контейнер, а не хост, на котором он работает. Попробуйте подключить БД, используя db_private имя вместо адреса 0.0.0.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...