Golang二进制内buildDocker容器,还是Mach-O可执行格式?

我真的可以在这里使用一些帮助。 我想要做的是使用标准的golang:1.5 Docker镜像来构build一个Go二进制文件,然后将这个二进制文件从容器中复制到一个基于busybox的新的最小的Docker容器中。 使用Docker安装的卷将二进制文件从容器中取出。 到目前为止,我遇到了两个问题。

  1. 主机上生成的二进制文件(并随后复制到第二个容器中)在运行file命令时似乎仍然是一个Mach-O 64位可执行file 。 Docker容器是否从主机获取GOOS和GOARCH?

  2. 当用bash手动运行容器并构buildGo二进制文件时,它现在说它是一个ELF可执行文件,但它是dynamic链接的。 我想默认情况下build立静态链接的二进制文件? 这个假设我可能是错的。

预先感谢您提供的任何帮助。

编辑:这是我使用的命令。 希望这个更清楚一点

 ## golang:1.5 base image with WORKDIR set to $GOPATH/src/myproject the source ## for the project was added in when creating the 'mybuild_img' docker image ## GOPATH is set automatically in the golang image. docker run -i -v `pwd`/jenkins/out:$GOPATH/src/myproject/jenkins/out mybuild_img:latest bash -c 'go build && cp myproject ./jenkins/out' 

一旦容器运行完毕,我在./jenkins/out/中有一个Mach-O 64位可执行文件。 我不知道是否这是一个奇怪的行为与docker-machine / boot2docker或类似的东西。 只是看起来很奇怪。 我已经确认,如果在go build命令之前设置了GOOS=linux GOARCH=amd64 ,那么我得到了正确types的可执行文件。 试图弄清楚这里发生了什么。

看起来你仍然对一些C库有约束力。 将Go可执行文件移动到超级最小容器时,这是一个常见问题。 你可以把这些绑定的库放到你的可执行文件中,通过改变成为CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . 你可以find更多关于这个问题的信息,以及它如何与Codeship博客上的最小docker构build相关联 。