sqlx.Connect()卡在docker alpine:latest

我有问题,我设法减less到以下代码:

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") } } 

我用代码和更多的解释来build立一个回购:

https://github.com/mraxus/mystery-golang-alpine

当我通过golang:latest docker-composegolang:latest镜像(这里是golang:latest )中创build并运行带有有效数据库URL的Go代码时,上述程序和postgres数据库都位于不同的容器中,程序按预期运行:

 build_1 | Postgres addr: postgres://postgres@postgres/postgres?sslmode=disable build_1 | Connecting successful 

然而,当我用相同的设置( docker-compose )在基本图像alpine:latest运行相同的程序时,程序只是停留在sqlx.Connect():

 alpine_1 | Postgres addr: postgres://postgres@postgres/postgres?sslmode=disable 

我不知道这是为什么。 你知道吗? 我已经build立了一个项目,看看别人是否可以重现并得到同样的问题,我得到:

https://github.com/mraxus/mystery-golang-alpine

喜欢听到一些可以帮助我解决这个问题的见解。

我的系统详情:

  • macOS 10.12.6(Sierra,MBP 2015年15月15寸)
  • docker工人17.06.1 1-ce-mac24

适当的解决scheme(通过实现实际问题)

所以事实certificate,在工作的公司networking有一个search域设置。 这会影响高山容器的名称parsing。 但是,默认的golang并不是。

为了解决这个问题,你可以通过修改config:来覆盖docker-compose容器的search域。

 build: dns_search: . image: image:build ... alpine: dns_search: . image: image:alpine ... 

请参阅https://github.com/mraxus/mystery-golang-alpine/pull/4

替代解决scheme(没有意识到实际问题)

通过强制使用cgo名称parsing器,不再有任何问题:

在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

应该提到的是,这个解决scheme仍然是可行的。 在我们真正的开发环境中,包含docker-compose中configuration的〜20个服务,一些docker高山图像仍然没有正确parsing。 但是,当用“合适的解决scheme”更新configuration时,一切都像魅力一样。