Gorm + Docker 连接时出错
Gorm + Docker error while connection
我正在尝试使用 Docker 连接到我的 postgresql 数据库:
package main
import (
"fmt"
"log"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
type Product struct {
gorm.Model
Code string
Price uint
}
var db *gorm.DB
func init() {
connection := fmt.Sprintf("host=db sslmode=disable user=dnz-dev password=dnz-dev")
db, err := gorm.Open("postgres", connection)
if err != nil {
log.Fatalln(err)
}
defer db.Close()
}
func main() {
// Migrate the schema
db.AutoMigrate(&Product{})
}
和docker-compose
版本:“3.3”
services:
db:
build: ./dnz-db
container_name: dnz-database
ports:
- "6000:5432"
volumes:
- ./dnz-db/data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=dnz-dev
- POSTGRES_PASSWORD=dnz-dev
api:
build: ./dnz-api
container_name: dnz-api
volumes:
- ./dnz-api:/go/src/app
ports:
- "5000:3000"
depends_on:
- db
我 运行 docker-compose up --build
我得到这个错误:
Attaching to dnz-database, dnz-api dnz-api | 2017/11/05 10:23:46 dial
tcp 172.21.0.2:5432: getsockopt: connection refused dnz-api | exit
status 1 dnz-api exited with code 1
我做错了什么?
您无法连接到您的 psql
容器,因为您还没有 link 编辑它。看看Docker-Compose documentation on links.
此外,我假设您没有安排容器启动顺序。 Psql
容器必须在 golang
的容器之前启动。查看 Docker Compose documentation on startup order. You can use wait-for-it 以实现文档中所述的 objective ast。只需 wget
并将其保存在您的项目中。
我不知道你 Dockerfile
的内容,但我假设它是这样的:
FROM golang:1.9
RUN mkdir -p /go/src/github.com/pavel/gorm-psql
WORKDIR /go/src/github.com/pavel/gorm-psql
ADD . /go/src/github.com/pavel/gorm-psql
RUN go get -v
因此,您的 docker-compose.yml
应该首先编辑为 运行 wait-for-it.sh
和 link psql
容器,例如:
version: '3.3'
services:
db:
image: postgres
environment:
POSTGRES_DB: dnz-dev
POSTGRES_USER: dnz-dev
POSTGRES_PASSWORD: dnz-dev
ports:
- 6000:5432
api:
build: .
command: ["./wait-for-it.sh", "db:6000", "--", "go", "run", "main.go"]
volumes:
- .:/go/src/github.com/pavel/gorm-psql
ports:
- "5000:3080"
depends_on:
- db
links:
- db
如果您的 main
有其他名字,只需更改即可。编辑您的 volumes
以指向您需要的任何路径。我用 /go/src/github.com/pavel/gorm-psql
设置了一个标准的。我假设您创建了一个名为 dnz-dev
的数据库,如果名称不同,请编辑它。
$ go env:
. . .
GOPATH="/home/pavel/go"
GOROOT="/usr/lib/go"
. . .
只需 运行 docker-compose up
就可以了。我依赖 postgresql and golang 最新图片。
我正在尝试使用 Docker 连接到我的 postgresql 数据库:
package main
import (
"fmt"
"log"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
type Product struct {
gorm.Model
Code string
Price uint
}
var db *gorm.DB
func init() {
connection := fmt.Sprintf("host=db sslmode=disable user=dnz-dev password=dnz-dev")
db, err := gorm.Open("postgres", connection)
if err != nil {
log.Fatalln(err)
}
defer db.Close()
}
func main() {
// Migrate the schema
db.AutoMigrate(&Product{})
}
和docker-compose
版本:“3.3”
services:
db:
build: ./dnz-db
container_name: dnz-database
ports:
- "6000:5432"
volumes:
- ./dnz-db/data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=dnz-dev
- POSTGRES_PASSWORD=dnz-dev
api:
build: ./dnz-api
container_name: dnz-api
volumes:
- ./dnz-api:/go/src/app
ports:
- "5000:3000"
depends_on:
- db
我 运行 docker-compose up --build
我得到这个错误:
Attaching to dnz-database, dnz-api dnz-api | 2017/11/05 10:23:46 dial tcp 172.21.0.2:5432: getsockopt: connection refused dnz-api | exit status 1 dnz-api exited with code 1
我做错了什么?
您无法连接到您的 psql
容器,因为您还没有 link 编辑它。看看Docker-Compose documentation on links.
此外,我假设您没有安排容器启动顺序。 Psql
容器必须在 golang
的容器之前启动。查看 Docker Compose documentation on startup order. You can use wait-for-it 以实现文档中所述的 objective ast。只需 wget
并将其保存在您的项目中。
我不知道你 Dockerfile
的内容,但我假设它是这样的:
FROM golang:1.9
RUN mkdir -p /go/src/github.com/pavel/gorm-psql
WORKDIR /go/src/github.com/pavel/gorm-psql
ADD . /go/src/github.com/pavel/gorm-psql
RUN go get -v
因此,您的 docker-compose.yml
应该首先编辑为 运行 wait-for-it.sh
和 link psql
容器,例如:
version: '3.3'
services:
db:
image: postgres
environment:
POSTGRES_DB: dnz-dev
POSTGRES_USER: dnz-dev
POSTGRES_PASSWORD: dnz-dev
ports:
- 6000:5432
api:
build: .
command: ["./wait-for-it.sh", "db:6000", "--", "go", "run", "main.go"]
volumes:
- .:/go/src/github.com/pavel/gorm-psql
ports:
- "5000:3080"
depends_on:
- db
links:
- db
如果您的 main
有其他名字,只需更改即可。编辑您的 volumes
以指向您需要的任何路径。我用 /go/src/github.com/pavel/gorm-psql
设置了一个标准的。我假设您创建了一个名为 dnz-dev
的数据库,如果名称不同,请编辑它。
$ go env:
. . .
GOPATH="/home/pavel/go"
GOROOT="/usr/lib/go"
. . .
只需 运行 docker-compose up
就可以了。我依赖 postgresql and golang 最新图片。