英文:
Can not connect to postgresql which is inside of a docker container
问题
我正在编写一个使用两个容器(db和app)进行Docker化的Go应用程序。
在启动容器时,执行'docker-compose up'命令时,我看到以下消息:dial tcp: lookup dbpgsql on 127.0.0.11:53: no such host
以下是我的docker-compose.yml文件内容:
version: '2'
services:
server:
hostname: app
image: golang:1.7.3-alpine
build: ./server/
privileged: true
container_name: server
command: go run server.go
volumes:
- ../src/:/go/src/
- ../server.go:/go/server.go
links:
- db:db
ports:
- '8080:8080'
env_file: environment
db:
hostname: dbpgsql
image: postgres:latest
container_name: db
environment:
POSTGRES_USER: cldb
POSTGRES_PASSWORD: cldb
POSTGRES_DB: cldb
ports:
- '5432:5432'
volumes:
- ./data:/docker-entrypoint-initdb.d
当执行DB.Ping()时,应用程序在此处失败:
func InitDB(dataSourceName string) {
var err error
DB, err = sql.Open("postgres", dataSourceName)
if err != nil {
log.Panic(err)
}
if err = DB.Ping(); err != nil {
log.Panic(err)
}
DB.SetMaxIdleConns(100)
}
希望这能帮到你!
英文:
I'm writing a go app which is dockerized in 2 containers: db and app.
while starting containers 'docker-compose up' I see the message: dial tcp: lookup dbpgsql on 127.0.0.11:53: no such host
DB_ENV_DB=cldb
DB_ENV_USER=cldb
DB_ENV_PASS=cldb
DB_PORT_5432_TCP_ADDR=dbpgsql
DB_PORT_5432_TCP_PORT=5432
here is my docker-compose.yml
version: '2'
services:
server:
hostname: app
image: golang:1.7.3-alpine
build: ./server/
privileged: true
container_name: server
command: go run server.go
volumes:
- ../src/:/go/src/
- ../server.go:/go/server.go
links:
- db:db
ports:
- '8080:8080'
env_file: environment
db:
hostname: dbpgsql
image: postgres:latest
container_name: db
environment:
POSTGRES_USER: cldb
POSTGRES_PASSWORD: cldb
POSTGRES_DB: cldb
ports:
- '5432:5432'
volumes:
- ./data:/docker-entrypoint-initdb.d
The app fails here when DB.Ping() is executed:
func InitDB(dataSourceName string) {
var err error
DB, err = sql.Open("postgres", dataSourceName)
if err != nil {
log.Panic(err)
}
if err = DB.Ping(); err != nil {
log.Panic(err)
}
DB.SetMaxIdleConns(100)
}
答案1
得分: 4
你可以使用服务名称(或在链接选项中给出的别名)连接到数据库,对于你的情况,它是 db
。主机名选项设置容器自身所知的主机名。但是它不会出现在docker ps命令的输出中,也不会出现在任何其他容器的/etc/hosts文件中。(https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/)
英文:
You can connect to database with the service name (or alias name given in links options), in your case it's db
. Hostname option sets the hostname by which the container knows itself. But it will not appear in docker ps nor in the /etc/hosts file of any other container. (https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/)
答案2
得分: 0
在我的情况下,我在我的PostgreSQL服务中使用了container_name
,这就是在应用程序连接到数据库时需要设置为主机名的内容。
英文:
In my case, I was using container_name
in my post-gres service and thats what was required to be set as hostname while connecting to db in application
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论