gpt4 book ai didi

docker - 无法从 docker 容器连接 mysql?

转载 作者:IT老高 更新时间:2023-10-28 21:25:23 29 4
gpt4 key购买 nike

我创建了一个 docker-compose 文件,它有两个服务,分别是 GoMysql。它为 go 和 mysql 创建容器。现在我正在运行尝试连接到作为 docker 容器运行的 mysql 数据库的代码。但我得到了错误。

docker-compose.yml

version: "2"
services:
app:
container_name: golang
restart: always
build: .
ports:
- "49160:8800"
links:
- "mysql"
depends_on:
- "mysql"

mysql:
image: mysql
container_name: mysql
volumes:
- dbdata:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=testDB
- MYSQL_USER=root
- MYSQL_PASSWORD=root
ports:
- "3307:3306"
volumes:
dbdata:

连接mysql数据库时出错

golang   | 2019/02/28 11:33:05 dial tcp 127.0.0.1:3306: connect: connection refused
golang | 2019/02/28 11:33:05 http: panic serving 172.24.0.1:49066: dial tcp 127.0.0.1:3306: connect: connection refused
golang | goroutine 19 [running]:

与 MySql 数据库的连接

func DB() *gorm.DB {
db, err := gorm.Open("mysql", "root:root@tcp(mysql:3306)/testDB?charset=utf8&parseTime=True&loc=Local")
if err != nil {
log.Panic(err)
}
log.Println("Connection Established")
return db
}

编辑:更新 docker 文件

FROM golang:latest 
RUN go get -u github.com/gorilla/mux
RUN go get -u github.com/jinzhu/gorm
RUN go get -u github.com/go-sql-driver/mysql
COPY ./wait-for-it.sh .
RUN chmod +x /wait-for-it.sh
WORKDIR /go/src/app
ADD . src
EXPOSE 8800
CMD ["go", "run", "src/main.go"]

我正在使用 gorm 包,它可以让我连接到数据库

最佳答案

depends_on 不是对 MySQL 实际上已准备好接收连接的验证。一旦数据库容器运行,它将启动第二个容器,无论它是否已准备好连接,这可能会导致您的应用程序出现此类问题,因为它期望数据库已准备好,这可能不是真的。

引自 the documentation :

depends_on does not wait for db and redis to be “ready” before starting web - only until they have been started.

有许多工具/脚本可用于解决此问题,例如 wait-for例如,如果您的图像基于 Alpine,则哪个 sh 兼容(如果您的图像中有 bash,则可以使用 wait-for-it)

你所要做的就是通过 Dockerfile 将脚本添加到你的镜像中,然后在 docker-compose.yml 中使用这个命令来创建你想要的服务它等待数据库。

-- 之后是您通常用来启动应用程序的命令

version: "2"
services:
app:
container_name: golang
...
command: ["./wait-for", "mysql:3306", "--", "go", "run", "myapplication"]
links:
- "mysql"
depends_on:
- "mysql"

mysql:
image: mysql
...

I have removed some parts from the docker-compose for easier readability.

Modify this part go run myapplication with the CMD of your golang image.

Controlling startup order更多关于这个问题和解决它的策略。


解决连接问题后会出现的另一个问题如下:

使用 root 值设置 MYSQL_USER 将导致 MySQL 失败并显示以下错误消息:

ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'

这是因为该用户已存在于数据库中,并试图创建另一个用户。如果您需要使用 root 用户本身,您可以只使用此变量 MYSQL_ROOT_PASSWORD 或更改 MYSQL_USER 的值,以便您可以在应用程序中安全地使用它而不是 root 用户.

更新:如果找不到并且路径正确,您可能需要编写如下命令:

command: sh -c "./wait-for mysql:3306 -- go run myapplication"

关于docker - 无法从 docker 容器连接 mysql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54925218/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com