Golang二进制内置Docker容器,仍然是Mach-O可执行格式?

时间:2015-11-05 20:17:25

标签: macos go docker boot2docker docker-machine

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

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

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

  3. 提前感谢您提供的任何帮助。

    编辑:这是我正在使用的命令。希望这会让它更清晰

    ## 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或其他类似的东西。看起来真的很奇怪。我已经确认如果我在GOOS=linux GOARCH=amd64命令之前设置go build,那么我确实得到了正确类型的可执行文件。只是想弄清楚这里发生了什么。

1 个答案:

答案 0 :(得分:2)

看起来您仍然绑定到某些C库。将Go可执行文件移动到超小容器时,这是一个常见问题。您可以通过更改将这些绑定库滚动到可执行文件中 dispatch_async(dispatch_get_main_queue()) { // update your managed objects & save }  至 go build您可以在Codeship's blog找到有关此问题及其与最小泊坞窗版本的关系的更多信息。