首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go编译的二进制文件不会在Ubuntu主机上的高寒码头容器中运行。

Go编译的二进制文件不会在Ubuntu主机上的高寒码头容器中运行。
EN

Stack Overflow用户
提问于 2016-03-29 08:34:29
回答 6查看 52.3K关注 0票数 101

给定使用GOOS=linuxGOARCH=amd64编译的二进制文件,该二进制文件部署到基于alpine:3.3docker容器中,如果对接引擎主机为Ubuntu (15.10),则不会运行二进制文件:

代码语言:javascript
复制
sh: /bin/artisan: not found

如果码头引擎主机是部署在Mac上的 VM内的busybox (alpine的基础),这个二进制文件(为相同的操作系统和arch编译)将只运行很好的busybox

如果容器是基于Ubuntu映像之一的话,同样的二进制文件也会运行得非常好。

知道这个二进制文件丢失了什么吗?

这就是我所做的复制(在OS X上的VirtualBox/busybox中成功运行,未显示):

构建(使用旗子显式构建,即使拱形匹配):

代码语言:javascript
复制
➜  artisan git:(master) ✗ GOOS=linux GOARCH=amd64 go build

检查它是否可以在主机上运行:

代码语言:javascript
复制
➜  artisan git:(master) ✗ ./artisan 
10:14:04.925 [ERROR] artisan: need a command, one of server, provision or build 

复制到码头dir,生成,运行:

代码语言:javascript
复制
➜  artisan git:(master) ✗ cp artisan docker/build/bin/        
➜  artisan git:(master) ✗ cd docker 
➜  docker git:(master) ✗ cat Dockerfile 
FROM docker:1.10
COPY build/ /
➜  docker git:(master) ✗ docker build -t artisan .
Sending build context to Docker daemon 10.15 MB
Step 1 : FROM docker:1.10
...
➜  docker git:(master) ✗ docker run -it artisan sh
/ # /bin/artisan 
sh: /bin/artisan: not found

现在将图像基更改为phusion/baseimage

代码语言:javascript
复制
➜  docker git:(master) ✗ cat Dockerfile 
#FROM docker:1.10
FROM phusion/baseimage
COPY build/ /
➜  docker git:(master) ✗ docker build -t artisan .
Sending build context to Docker daemon 10.15 MB
Step 1 : FROM phusion/baseimage
...
➜  docker git:(master) ✗ docker run -it artisan sh
# /bin/artisan
08:16:39.424 [ERROR] artisan: need a command, one of server, provision or build 
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-03-30 12:09:37

默认情况下,如果使用net包,构建可能会产生具有某种动态链接(如libc )的二进制文件。您可以通过查看ldd output.bin的结果来动态检查与静态链接

我遇到了两种解决方案:

  • 通过CGO_ENABLED=0禁用CGO
  • 强制使用Go实现的网络依赖关系,netgo通过go build -tags netgo -a -v,这是实现的特定平台。

来自https://golang.org/doc/go1.2

默认情况下,net包需要cgo,因为主机操作系统通常必须中介网络调用设置。然而,在某些系统上,不需要cgo就可以使用网络,而且这样做很有用,例如避免动态链接。新的构建标记netgo (默认情况下关闭)允许在那些可能的系统上构建纯Go的网络包。

上面的假设是,唯一的CGO依赖项是标准库的net包。

票数 115
EN

Stack Overflow用户

发布于 2018-06-14 15:57:18

对于go二进制文件,我也遇到了同样的问题,在将它添加到我的docker文件之后,我让它开始工作:

代码语言:javascript
复制
RUN apk add --no-cache libc6-compat 
票数 102
EN

Stack Overflow用户

发布于 2017-07-04 19:41:13

构建机器上的Go编译器可能会将二进制文件链接到与高山不同位置的库中。在我的例子中,它是用/lib64下的依赖项编译的,但是Alpine不使用该文件夹。

代码语言:javascript
复制
FROM alpine:edge AS build
RUN apk update
RUN apk upgrade
RUN apk add --update go=1.8.3-r0 gcc=6.3.0-r4 g++=6.3.0-r4
WORKDIR /app
ENV GOPATH /app
ADD src /app/src
RUN go get server # server is name of our application
RUN CGO_ENABLED=1 GOOS=linux go install -a server

FROM alpine:edge
WORKDIR /app
RUN cd /app
COPY --from=build /app/bin/server /app/bin/server
CMD ["bin/server"]

我正在写关于这个问题的文章。您可以在这里找到这个解决方案的草稿,http://kefblog.com/2017-07-04/Golang-ang-docker

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36279253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档