【发布时间】:2021-12-18 21:43:15
【问题描述】:
我无法在 docker 容器中运行我的 mysql 数据库。我用 go 构建了一个非常简单的 web 服务来尝试解决错误,但是无论我尝试什么,在启动 docker build 时,我都会不断收到“连接被拒绝错误”
所以我做了一个最简单的最小例子,目录树看起来像这样:
Example/
| ---- Dockerfile
| ---- main.go
| ---- docker-compose.yml
database/
| ---- Dockerfile
| ---- example.sql
我的 Example/Dockerfile 看起来像这样:
FROM golang:alpine
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
WORKDIR /build
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -o main .
EXPOSE 8080
CMD ["/build/main"]
数据库dockerfile只有三行:
FROM mysql:8.0.24
COPY example.sql /docker-entrypoint-initdb.d/example.sql
EXPOSE 3306
main.go 小而简单:
package main
import "fmt"
import "net/http"
import _ "github.com/go-sql-driver/mysql"
import "database/sql"
import "log"
func main() {
http.HandleFunc("/", handler)
db, err := sql.Open("mysql", "user:password@tcp(db:3307)/example") // -- this is the troublemaker!
if err != nil {
log.Fatal(err)
}
pingErr := db.Ping()
if pingErr != nil {
log.Fatal(pingErr)
}
fmt.Println("Connected to DB")
http.ListenAndServe(":8080", nil)
}
func handler(w http.ResponseWriter, r *http.Request){
fmt.Println("Calling handler")
fmt.Println(r.URL.Path)
}
docker-compose.yml 也没什么特别的
version: '3'
services:
db:
build:
context: ./database
volumes:
- database:/database/data
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: example
MYSQL_USER: user
MYSQL_PASSWORD: password
container_name: container_db
ports:
- "3307:3306"
networks:
- default
api:
build:
context: .
restart: on-failure
container_name: "container_api"
volumes:
- api:/usr/api
ports:
- "8080:8080"
networks:
- default
volumes:
database:
api:
而且数据库文件example.sql也很简单
CREATE DATABASE IF NOT EXISTS example;
CREATE USER IF NOT EXISTS 'user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;
CREATE TABLE IF NOT EXISTS exampleTable (
id INT NOT NULL,
name VARCHAR(2048) NOT NULL,
lastName VARCHAR(2048)
PRIMARY KEY (`id`)
);
我尝试在连接中使用服务名称so db,以及容器名称container_db,但错误仍然存在。我还发现了一个帖子,建议配置mysql绑定值0.0.0.0,但这也没有帮助我。
有时我也只得到一个错误输出:“container_api exited with code 1”
【问题讨论】: