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-compose
在golang: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时,一切都像魅力一样。