postgresql - sqlx.Connect() 卡在 docker alpine :latest 中

标签 postgresql docker go alpine-linux sqlx

我遇到的问题已设法减少为以下代码:

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/

相关文章:

sql - 如果第二个表中有匹配项或没有匹配项,如何编写 SQL 查询来获取记录?

python - 如果使用python在postgres中主键或id相同,如何附加值

php - 如何使用 docker 卷与主机共享容器文件?

Docker 鲸鱼图标未出现在系统托盘中

go - go - 如何使用证书存储中的证书并在 gin 框架中运行 TLS?

sql - 带连接的 Postgres RETURNING 子句

sql - PostgreSQL 中具有互换列值的行的聚合

php - ImageMagick PHP Docker版本问题

linux - 获取文件的uid和gid

pointers - 如何更改在golang中作为结构引用传递的空接口(interface)的值?