У меня есть 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