静态链接去二进制上没有可访问的服务器
No reachable servers on static linked go binary
根据我的二进制文件的执行位置,我在 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 上编译应用程序,并在 alpine 容器上 运行 编译应用程序。
问题是:为什么同一个可执行文件在不同的基础映像上得到不同的结果?
mgo(或 go)是否使用与 OS 相关的东西?我的意思是,似乎我的二进制文件 运行 仅适用于基于 red hat 的发行版(只是猜测,现在对我来说没有多大意义。)
拨号源代码:
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())
}
刚刚解开了谜团。它确实与 docker 基本图像有关,而不是与构建步骤有关。
如果我这样做,它会完美地工作:
FROM debian
RUN apt-get update
RUN apt-get install -y ca-certificates
因为我的目标是使用 alpine 图像,所以我现在使用的是:
FROM alpine
RUN apk --no-cache add ca-certificates
希望对遇到同样问题的人有所帮助。有关详细信息,请参阅:http://blog.cloud66.com/x509-error-when-using-https-inside-a-docker-container/
PS.: 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 上编译应用程序,并在 alpine 容器上 运行 编译应用程序。
问题是:为什么同一个可执行文件在不同的基础映像上得到不同的结果?
mgo(或 go)是否使用与 OS 相关的东西?我的意思是,似乎我的二进制文件 运行 仅适用于基于 red hat 的发行版(只是猜测,现在对我来说没有多大意义。)
拨号源代码:
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())
}
刚刚解开了谜团。它确实与 docker 基本图像有关,而不是与构建步骤有关。
如果我这样做,它会完美地工作:
FROM debian
RUN apt-get update
RUN apt-get install -y ca-certificates
因为我的目标是使用 alpine 图像,所以我现在使用的是:
FROM alpine
RUN apk --no-cache add ca-certificates
希望对遇到同样问题的人有所帮助。有关详细信息,请参阅:http://blog.cloud66.com/x509-error-when-using-https-inside-a-docker-container/
PS.: mgo(无法访问的服务器)错误消息指出我的方向错误。