我真的可以在这里使用一些帮助。我想要做的是使用标准的golang:1.5 Docker镜像来构建Go二进制文件,然后将该二进制文件从容器中复制到基于busybox的新的最小Docker容器中。使用Docker安装的卷将二进制文件从容器中拉出。到目前为止,我遇到了两个问题。
运行file
命令时,主机上生成的二进制文件(随后复制到第二个容器中)似乎仍然是一个Mach-O 64位可执行文件。 Docker容器是否以某种方式从主机获取GOOS和GOARCH?
当手动运行带有bash
的容器并构建Go二进制文件时,它现在说它是一个ELF可执行文件,但它是动态链接的。我认为默认情况下构建静态链接的二进制文件?我在这个假设中可能是错的。
提前感谢您提供的任何帮助。
编辑:这是我正在使用的命令。希望这会让它更清晰
## 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
,那么我确实得到了正确类型的可执行文件。只是想弄清楚这里发生了什么。
答案 0 :(得分:2)
看起来您仍然绑定到某些C库。将Go可执行文件移动到超小容器时,这是一个常见问题。您可以通过更改将这些绑定库滚动到可执行文件中
dispatch_async(dispatch_get_main_queue()) {
// update your managed objects & save
}
至
go build
您可以在Codeship's blog找到有关此问题及其与最小泊坞窗版本的关系的更多信息。