静态链接的二进制文件上没有可访问的服务器

时间:2018-03-14 20:23:48

标签: docker go mgo

根据我的二进制文件的执行位置,我在mgo Dial上获得了不同的结果。

现在,我正在我的机器上构建(Fedora:uname -a:Linux localhost.localdomain 4.15.6-300.fc27.x86_64#1 SMP Mon Feb 26 18:43:03 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux)使用以下命令:

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-s' -o myProgram

所以,如果我使用:

构建我的docker镜像
FROM centos
COPY myProgram "/usr/local/bin/myProgram"
ENTRYPOINT ["/usr/local/bin/myProgram"]

完美无缺。这意味着我已连接到数据库。但是,如果我改为:

FROM debian
COPY myProgram "/usr/local/bin/myProgram"
ENTRYPOINT ["/usr/local/bin/myProgram"]

我正在无法访问服务器。我的目标是使用golang图像在gitlab-ci上编译应用程序,并在高山容器上运行它。

问题是:为什么同一个可执行文件在不同的基本图像上会得到不同的结果?

mgo(或go)是否使用与操作系统相关的内容?我的意思是,似乎我的二进制文件只能在基于红帽的发行版上运行(只是一个猜测,现在对我来说没什么意义。)

拨打源代码:

dialInfo := &mgo.DialInfo{
    Addrs:          config.Addr,
    Database:       config.Auth,
    Username:       config.User,
    Password:       config.Pass,
    ReplicaSetName: config.ReplicaSet,
    Timeout:        time.Second * 10,
}
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
    return tls.Dial("tcp", addr.String(), &tls.Config{})
}

session, err := mgo.DialWithInfo(dialInfo)
if err != nil {
    log.Fatal(err.Error())
}

1 个答案:

答案 0 :(得分:2)

刚刚解开了这个谜团。它确实与docker基础映像有关,而不是与构建步骤有关。

如果我这样做,它将完美运作:

FROM debian
RUN apt-get update
RUN apt-get install -y ca-certificates

由于我的目标是使用高山图像,我现在使用以下内容:

FROM alpine
RUN apk --no-cache add ca-certificates

希望能帮助有同样问题的人。有关详细信息,请参阅:http://blog.cloud66.com/x509-error-when-using-https-inside-a-docker-container/

PS。:mgo(无法访问服务器)错误消息指出我的方向错误。