给定使用GOOS=linux和GOARCH=amd64编译的二进制文件,该二进制文件部署到基于alpine:3.3的docker容器中,如果对接引擎主机为Ubuntu (15.10),则不会运行二进制文件:
sh: /bin/artisan: not found如果码头引擎主机是部署在Mac上的 VM内的busybox (alpine的基础),这个二进制文件(为相同的操作系统和arch编译)将只运行很好的busybox。
如果容器是基于Ubuntu映像之一的话,同样的二进制文件也会运行得非常好。
知道这个二进制文件丢失了什么吗?
这就是我所做的复制(在OS X上的VirtualBox/busybox中成功运行,未显示):
构建(使用旗子显式构建,即使拱形匹配):
➜ artisan git:(master) ✗ GOOS=linux GOARCH=amd64 go build检查它是否可以在主机上运行:
➜ artisan git:(master) ✗ ./artisan
10:14:04.925 [ERROR] artisan: need a command, one of server, provision or build 复制到码头dir,生成,运行:
➜ 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
➜ 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 发布于 2016-03-30 12:09:37
默认情况下,如果使用net包,构建可能会产生具有某种动态链接(如libc )的二进制文件。您可以通过查看ldd output.bin的结果来动态检查与静态链接
我遇到了两种解决方案:
CGO_ENABLED=0禁用CGOgo build -tags netgo -a -v,这是实现的特定平台。来自https://golang.org/doc/go1.2
默认情况下,net包需要cgo,因为主机操作系统通常必须中介网络调用设置。然而,在某些系统上,不需要cgo就可以使用网络,而且这样做很有用,例如避免动态链接。新的构建标记netgo (默认情况下关闭)允许在那些可能的系统上构建纯Go的网络包。
上面的假设是,唯一的CGO依赖项是标准库的net包。
发布于 2018-06-14 15:57:18
对于go二进制文件,我也遇到了同样的问题,在将它添加到我的docker文件之后,我让它开始工作:
RUN apk add --no-cache libc6-compat 发布于 2017-07-04 19:41:13
构建机器上的Go编译器可能会将二进制文件链接到与高山不同位置的库中。在我的例子中,它是用/lib64下的依赖项编译的,但是Alpine不使用该文件夹。
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。
https://stackoverflow.com/questions/36279253
复制相似问题