我遇到的问题已设法减少为以下代码:
package main
import (
"fmt"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
"os"
)
func main() {
addr := os.Getenv("DB")
fmt.Println("Postgres addr: " + addr)
_, err := sqlx.Connect("postgres", addr)
if err != nil {
fmt.Println("Could not connect...")
} else {
fmt.Println("Connecting successful")
}
}
我在以下位置设置了一个包含代码和更多解释的存储库:
https://github.com/mraxus/mystery-golang-alpine
当我通过 docker-compose
在 docker 镜像(这里是 golang:latest
)中使用有效的 DB url 构建并运行此 Go 代码时,上面的程序并且 postgres 数据库位于单独的容器中,程序按预期运行:
build_1 | Postgres addr: postgres://postgres@postgres/postgres?sslmode=disable
build_1 | Connecting successful
但是,当我在相同的设置 (docker-compose
) 中使用基本镜像 alpine:latest
运行相同的程序时,程序会卡在 sqlx 上。连接():
alpine_1 | Postgres addr: postgres://postgres@postgres/postgres?sslmode=disable
我不知道这是为什么。你知道吗?我已经设置了一个项目以查看其他人是否可以重现并遇到与我遇到的问题相同的问题:
https://github.com/mraxus/mystery-golang-alpine
很高兴听到一些可以帮助我解决这个问题的见解。
我的系统详细信息:
- macOS 10.12.6(Sierra,MBP 2015 年中 15 英寸)
- docker 17.06.1 1-ce-mac24
最佳答案
正确的解决方案(通过实现实际问题)
事实证明,工作中的公司网络有一个搜索域集。这会影响 alpine 容器名称解析。但是,默认的 golang 不是。
要解决这个问题,您可以通过修改配置来覆盖 docker-compose 容器搜索域:
build:
dns_search: .
image: image:build
...
alpine:
dns_search: .
image: image:alpine
...
参见 https://github.com/mraxus/mystery-golang-alpine/pull/4
替代方案(没有意识到实际问题)
通过强制 go 使用 cgo
名称解析器,不再有任何问题:
在 docker-compose.yml 中
alpine:
image: mamarcus.org/project:alpine
links:
- postgres
environment:
DB: "postgres://postgres@postgres/postgres?sslmode=disable"
GODEBUG: "netdns=cgo"
参见 https://github.com/mraxus/mystery-golang-alpine/pull/3
应该提到这个解决方案仍然存在问题。在我们真实的开发环境中,包含约 20 个在 docker-compose 中配置的服务,一些 docker alpine 图像仍然没有正确解析。但是,当使用“正确的解决方案”更新配置时,一切都很顺利。
关于postgresql - sqlx.Connect() 卡在 docker alpine :latest 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46132750/