我已经尝试将 golang 容器与 mysql 容器连接近 5 天,每次我都遇到有关“连接被拒绝”问题的问题,所以我添加了等待以便 golang 容器在 Mysql 连接时等待连接容器正在准备自己......但是在 docker 文件和 docker compose 文件中添加该 Wait 命令并没有解决任何问题。
这是我一直面临的错误
docker-compose up
Creating network "bucket-api_fullstack" with driver "br
Creating bucket-database ... done
Creating bucket-api ... done
Attaching to bucket-database, bucket-api
bucket-api | -------------------------------------
bucket-api | docker-compose-wait 2.7.2
bucket-api | ---------------------------
bucket-api | Starting with configuration:
bucket-api | - Hosts to be waiting for: [bucket-m
bucket-api | - Timeout before failure: 300 second
bucket-api | - TCP connection timeout before retr
bucket-api | - Sleeping time before checking for
bucket-api | - Sleeping time once all hosts are a
bucket-api | - Sleeping time between retries: 30
bucket-api | -------------------------------------
bucket-api | Checking availability of bucket-mysql
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-database | 2021-02-13 06:01:44+00:00 [Note] [Ent MySQL Server 8.0.23-1debian10 started.
bucket-database | 2021-02-13 06:01:44+00:00 [Note] [Entd user 'mysql'
bucket-database | 2021-02-13 06:01:44+00:00 [Note] [Ent MySQL Server 8.0.23-1debian10 started.
bucket-database | 2021-02-13T06:01:45.306754Z 0 [Systemn/mysqld (mysqld 8.0.23) starting as process 1
bucket-database | 2021-02-13T06:01:45.415685Z 1 [Systemnitialization has started.
bucket-database | 2021-02-13T06:01:47.738724Z 1 [Systemnitialization has ended.
bucket-database | 2021-02-13T06:01:48.172811Z 0 [System ready for connections. Bind-address: '::' port: 33060,.sock
bucket-database | 2021-02-13T06:01:48.350857Z 0 [System XA crash recovery...
bucket-database | 2021-02-13T06:01:48.357430Z 0 [System recovery finished.
bucket-database | 2021-02-13T06:01:48.743684Z 0 [Warninificate ca.pem is self signed.
bucket-database | 2021-02-13T06:01:48.744238Z 0 [System
mysql_main configured to support TLS. Encrypted connect channel.
bucket-database | 2021-02-13T06:01:48.918000Z 0 [Warnine configuration for --pid-file: Location '/var/run/mysqo all OS users. Consider choosing a different directory
bucket-database | 2021-02-13T06:01:49.233036Z 0 [Systemn/mysqld: ready for connections. Version: '8.0.23' socck' port: 3306 MySQL Community Server - GPL.
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Timeout! After 300 seconds some hosts
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Timeout! After 300 seconds some hosts
bucket-api exited with code 1
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Host bucket-mysql:3305 not yet availa
bucket-api | Timeout! After 300 seconds some hosts
bucket-api exited with code 1
bucket-api | Host bucket-mysql:3305 not yet availa
这是我的 Dockerfile
#Builder image build the go binary : Setting the alias as builder
FROM golang:1.15-alpine as builder
RUN mkdir /app
# add this file directory to the image
ADD . /app
# directory where the source file execution takes place
WORKDIR /app
# RUN some go commands
RUN go clean --modcache
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./src/
# Our production image used to run our app
FROM alpine:latest
RUN apk --no-cache add ca-certificates
RUN apk add --no-cache git make musl-dev go
COPY --from=builder /app/main .
# Add docker-compose-wait tool -------------------
ENV WAIT_VERSION 2.7.2
ADD https://github.com/ufoscout/docker-compose-wait/releases/download/$WAIT_VERSION/wait /wait
RUN chmod +x /wait
# Configure GO
ENV GOROOT /usr/lib/go
ENV GOPATH /go
ENV PATH /go/bin:$PATH
RUN mkdir -p ${GOPATH}/src ${GOPATH}/bin
EXPOSE 8084
CMD ["./main"]
这是我的 docker-compose 文件
version: '3.8'
services:
# MYSQL DATABASE DOCKER
bucket-mysql:
image: mysql:latest
container_name: bucket-database
command: --default-authentication-plugin=mysql_native_password
ports:
- "3305:3306"
expose:
- "3305"
environment:
MYSQL_ROOT_PASSWORD: "123"
MYSQL_USER: "bu"
MYSQL_PASSWORD: "root"
MYSQL_DATABASE: "rb_db"
networks:
- fullstack
volumes:
- database_mysql:/var/lib/mysql
restart: always
cap_add:
- SYS_NICE
healthcheck:
test: ["CMD-SHELL", "echo 'select 1' |mysql -u root -p'pagal!123' --silent"]
interval: 30s
timeout: 20s
retries: 6
#API DOCKER
bucket:
image: bucketapi
build: .
container_name: bucket-api
command: sh -c "/wait"
environment:
WAIT_HOSTS: bucket-mysql:3305
WAIT_HOSTS_TIMEOUT: 300
WAIT_SLEEP_INTERVAL: 30
WAIT_HOST_CONNECT_TIMEOUT: 30
MYSQL_ROOT_PASSWORD: "pagal!123"
MYSQL_USER: "bu"
MYSQL_PASSWORD: "123"
MYSQL_DATABASE: "rb_db"
# MYSQL_HOST: "bucket-database"
# MYSQL_PORT: "3305"
ports:
- "8084:8084"
restart: on-failure
# volumes:
# - ./src:/usr/src/app/
depends_on:
- bucket-mysql
networks:
- fullstack
volumes:
database_mysql:
networks:
fullstack:
driver: bridge
这是我的 Go MySQL 连接代码
func init() {
// loaDerr := godotenv.Load()
// if loaDerr != nil {
// log.Fatal("Error loading .env file")
// }
username := os.Getenv("MYSQL_USER")
password := os.Getenv("MYSQL_ROOT_PASSWORD")
host := os.Getenv("WAIT_HOSTS")
port := os.Getenv("MYSQL_PORT")
schema := os.Getenv("MYSQL_DATABASE")
fmt.Println(username, password, host, port, schema)
dataSourceName := fmt.Sprintf(
"%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
username,
password,
host,
// port,
schema,
)
var err error
//connect to the database server
client, err = sql.Open("mysql", dataSourceName)
if err != nil {
panic(err)
}
//checking the connection
if connectionErr := client.Ping(); connectionErr != nil {
panic(connectionErr.Error())
}
fmt.Println("Database connection is been established succesfully")
}
请帮助我,我已经尝试了所有组合,但它不起作用,如果我将 mysql 工作台与正在运行的 mysql 容器连接,它会正常连接并且不会给出任何错误,但是与 docker 和 golang 连接它会给我一个错误谢谢
答案 0 :(得分:1)
在您的 DSN 中,您没有设置端口,在您的 docker-compose
fmt.Println(username, password, host, port, schema)
dataSourceName := fmt.Sprintf(
"%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local",
username,
password,
host,
schema,
)
添加端口到 DSN
fmt.Println(username, password, host, port, schema)
dataSourceName := fmt.Sprintf(
"%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
username,
password,
host,
port
schema,
)
答案 1 :(得分:1)
每当您在容器之间建立连接时,Docker 都会使用服务侦听的“普通”端口。如果您连接到 MySQL 或 MariaDB 容器,它总是使用端口 3306; ports:
在这种情况下不是必需的,如果是,它们将被忽略。
services:
bucket-mysql:
image: mysql:latest
# neither expose: nor ports: are required
bucket:
build: .
environment:
WAIT_HOSTS: bucket-mysql:3306 # ignores ports: remapping
MYSQL_HOST: bucket-mysql
# MYSQL_PORT: "3306" # this is the default port
(expose:
在现代 Docker 中几乎什么都不做,删除它是安全的;如果你有它,端口号就是容器内的端口号,而 mysql
图像已经有了EXPOSE 3306
在其 Dockerfile 中。您还可以安全地依赖 Compose 的 networks:
、container_name:
和内置 image:
名称的默认值,此外您通常不需要覆盖command:
来自您的 Dockerfile 为其 CMD
指定的内容。这可能有助于简化您的 docker-compose.yml
文件。)
答案 2 :(得分:0)
查看您的设置:
WAIT_HOSTS:bucket-mysql:3305
您在 GO 应用中使用的是相同的,应该是 3306!
3305 是它在主机上运行的端口