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

我遇到了无法简化为以下代码的问题:</ p>

< pre> 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(“无法连接...”)
}否则{
fmt.Println(“连接成功”)
}
} \ n </ code> </ pre>

我在以下位置设置了代码和更多说明的存储库:</ p>

https://github.com/mraxus/mystery-golang-alpine </ p>

当我 通过 docker-compose </ code>在docker镜像(此处为 golang:latest </ code>)中使用有效的数据库URL构建并运行此Go代码,其中上述程序和postgres db 在单独的容器中,程序按预期运行:</ p>

  build_1 |  Postgres地址:postgres:// postgres @ postgres / postgres?sslmode = disable 
build_1 | 成功连接
</ code> </ pre>

但是,当我在相同设置( docker-compose </ code>)中使用基本映像 alpine运行相同程序时 :latest </ code>,程序只是停留在sqlx.Connect():</ p>

  alpine_1 |  Postgres地址:postgres:// postgres @ postgres / postgres?sslmode = disable 
</ code> </ pre>

我不知道为什么会这样。 你知道吗? 我已经建立了一个项目,看看其他人是否可以复制并得到与我得到的相同的问题:</ p>

https://github.com/mraxus/mystery-golang-alpine </ p>

喜欢听听一些能帮助我解决这个问题的见解 </ p>

我的系统详细信息:</ p>


  • macOS 10.12.6(Sierra,MBP 2015年中15英寸)</ li >
  • docker 17.06.1 1-ce-mac24 </ li>
    </ ul>
    </ div>

展开原文

原文

I have problem that I've managed to reduce to the following code:

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

I set up a repo with the code and more explanations at:

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

When I build and run this Go code with a valid DB url in a docker image (here golang:latest) throught docker-compose, where both the above program and the postgres db is in separate containers, the program runs as expected:

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

However, when I run the same program in same setup (docker-compose) with the base image alpine:latest, the program just gets stuck at the sqlx.Connect():

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

I have no idea why this is. Do you know? I have setup a project to see if others can reproduce and get the same problem as I get:

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

Love to hear some insights that can help me solve this issue.

My system details:

  • macOS 10.12.6 (Sierra, MBP Mid 2015 15-inch)
  • docker 17.06.1 1-ce-mac24

doutangtan6386
doutangtan6386 你是对的。在朋友的帮助下进行一些挖掘之后,我们找到了一个可行的解决方案。我在这里提出“解决方案”:github.com/mraxus/mystery-golang-alpine/pull/3
大约 3 年之前 回复
dtc9222
dtc9222 尝试使用IP更改postgres主机名,可能是您遇到容器的网络配置问题。
大约 3 年之前 回复
drs7798
drs7798 感谢您检查@TarunLalwani。很高兴知道它可以在其他平台上运行。我在问题中添加了系统详细信息。Docker刚刚发布了适用于Mac的更新(17.06.2-ce,构建cec0b72),但没有任何区别。我将继续我的追求。
大约 3 年之前 回复
du248227
du248227 这可能是特定于OS的,因为两个映像都对我有用。我在VagrantVMUbuntu16.04LTS上运行了它们
大约 3 年之前 回复
dongshi1606
dongshi1606 Thx修复@Flimzy
大约 3 年之前 回复
douxian1923
douxian1923 谢谢你的建议。好主意。但是,似乎对我没有帮助:github.com/mraxus/mystery-golang-alpine/pull/1
大约 3 年之前 回复
doupi8598
doupi8598 与其尝试从golang:latest构建高山容器,不如尝试从golang:alpine构建。
大约 3 年之前 回复

1个回答



正确的解决方案(通过实现实际问题)</ h2>

因此事实证明,公司网络 在工作中设置了搜索域。 这会影响高山容器的名称解析。 但是,默认的golang不是。</ p>

要解决此问题,您可以通过修改config覆盖docker-compose容器搜索域:</ p>

   build:
dns_search:。
图片:image:build
...

alpine:
dns_search:。
image:image:alpine
...
</ code> </ pre>

请参见 https:// github。 com / mraxus / mystery-golang-alpine / pull / 4 </ p>

替代解决方案(尚未意识到实际问题)</ h2>

强制使用 cgo </ code>名称解析器,不再有任何问题:</ p>

在docker-compose.yml </ p>

  alpine:
图片:mamarcus.org/project:alpine
链接:
-postgres
环境:
DB:“ postgres:// postgres @ postgres / postgres?sslmode = disable”
GODEBUG:“ netdns = cgo”
</ code> </ pre>

请参见 https://github.com/mraxus/mystery-golang-alpine/pull/3 </ p>

应该提到的</ em> 解决方案仍是不确定的。 在我们的实际开发环境中,包含约20个在docker-compose中配置的服务,某些docker alpine映像仍无法正确解析。 但是,当使用“适当的解决方案”更新配置时,一切都像灵符一样。</ p>
</ div>

展开原文

原文

Proper solution (by realizing the actual problem)

So it turns out that the corporate network at work have a search domain set. This affects the alpine containers name resolution. However, the default golang is not.

To solve the problem, you can overwrite docker-compose containers search domain, by modifying the config:

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

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

See https://github.com/mraxus/mystery-golang-alpine/pull/4

Alternative solution (not having realized the actual problem)

By forcing go to use the cgo name resolver, there is no longer any issues:

In docker-compose.yml

alpine:
    image: mamarcus.org/project:alpine
    links:
        - postgres
    environment:
        DB: "postgres://postgres@postgres/postgres?sslmode=disable"
        GODEBUG: "netdns=cgo"

See https://github.com/mraxus/mystery-golang-alpine/pull/3

It should be mentioned that this solution is still iffy. In our real dev environment, containing ~20 services configured in docker-compose, some docker alpine images still did not resolve properly. But when updating the configuration with the "proper solution", everything worked like a charm.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐