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
我不确定你的 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!")
}