mysql 连接拒绝且服务器行为异常

问题描述 投票:0回答:1

Dockerfile:

FROM golang:alpine3.19

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .

# Build the Go application
RUN go build -o main .

# Expose the port the app will run on
#EXPOSE 4040

# Command to run the executable
CMD ["./main"]

下面是

docker-compose.yml
:

version: '3'
services:
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
      MYSQL_PASS: mysqlpassword
      MYSQL_DATABASE: gotodo
    ports:
      - "3306:3306"
    networks:
      - mygonet

  go-todo:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "4040:4040"
    depends_on:
      - mysql
    environment:
      DB_PORT: 3306
      DB_HOST: mysql
      DB_USER: root 
      
    networks:
      - mygonet

networks:
  mygonet:
    driver: bridge

我希望运行这个 docker compose,但它给出错误:

go-todo-1  | go: downloading github.com/go-sql-driver/mysql v1.7.1
go-todo-1  | Database Connection Successful
go-todo-1  | dial tcp: lookup mysql on 127.0.0.11:53: server misbehaving
go-todo-1  | dial tcp: lookup mysql on 127.0.0.11:53: server misbehaving
go-todo-1  | dial tcp: lookup mysql on 127.0.0.11:53: server misbehaving
docker docker-compose dockerfile
1个回答
0
投票

我不确定你的 Go 代码是什么样的,但这个设置对我有用。

├── docker-compose.yml
├── Dockerfile
├── go.mod
└── main.go

🗎

docker-compose.yml

version: '3'
services:
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: gotodo
    ports:
      - "3306:3306"

  go-todo:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "4040:4040"
    depends_on:
      - mysql
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASS: password
      MYSQL_DATABASE: gotodo

🗎

Dockerfile
(使用“等待”脚本来确保 MySQL 在连接之前准备就绪。)

FROM golang:alpine3.19

RUN apk add --no-cache curl

WORKDIR /app

COPY . .

RUN go mod tidy

RUN go build -o main .

RUN curl -o wait-for.sh https://raw.githubusercontent.com/eficode/wait-for/master/wait-for && \
    chmod +x wait-for.sh

CMD ["./wait-for.sh", "mysql:3306", "--", "./main"]

🗎

go.mod

module your_module_name

go 1.18

require github.com/go-sql-driver/mysql v1.7.1

🗎

main.go

package main

import (
    "database/sql"
    "fmt"
    "log"
    "os"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    mysqlHost := os.Getenv("MYSQL_HOST")
    mysqlUser := os.Getenv("MYSQL_USER")
    mysqlPass := os.Getenv("MYSQL_PASS")
    mysqlDatabase := os.Getenv("MYSQL_DATABASE")

    dsn := fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?parseTime=true", mysqlUser, mysqlPass, mysqlHost, mysqlDatabase)

    // Connect to the MySQL database.
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Test the database connection.
    err = db.Ping()
    if err != nil {
        log.Fatal("Error connecting to the database: ", err)
    }

    fmt.Println("Database Connection Successful!")
}

© www.soinside.com 2019 - 2024. All rights reserved.