为golang静态二进制文件构建,部署,推送docker镜像

时间:2017-01-18 14:49:38

标签: go docker makefile

我正在寻找解决一个简单配置问题的解决方案;它已经唠叨了我一段时间了。 :)

我在github上有一个golang项目,它给了我一个静态二进制文件,并使用godeps。

现在我想确保在本地新构建的二进制文件构建git clone和docker容器之后可以运行godep go install ...命令。

作为一种选择,用户应该能够将其推送到泊坞中心或私人仓库。

我正在考虑使用Makefiles,但这似乎太复杂了(设置gopath,然后是godep构建,动态修改Dockerfile以指向二进制文件所在的位置,然后是docker build)。

有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

到目前为止,当我遇到你的情况时,我总是想出一个Makefile来做所有的工作,就像你说的那样,从来都不是那么简单。虽然它从未如此简单,但我已经使用至少2种不同的方法来完成它,这取决于您在构建过程和开发环境之间所需的依赖性级别。

最简单的方法是,正如你所说的,只需在Makefile中输入你自己要做的步骤。您可以使用Dockerfiles ARGuments来参数化二进制名称,这样您就不必在构建期间修改Dockerfile。

在这里你有一个快速而肮脏(工作)的Makefile,我刚刚为你开始做好准备:

APP_IMAGE=group/example
APP_TAG=1.0
APP_BINARY=example

.PHONY: clean image binary

all: image

clean:
    if [ -r $(APP_BINARY) ]; then rm $(APP_BINARY); fi
    if [ -n "$$(docker images -q $(APP_IMAGE):$(APP_TAG))" ]; then docker rmi $(APP_IMAGE):$(APP_TAG); fi

image: binary
    docker build --build-arg APP_BINARY=$(APP_BINARY) -t $(APP_IMAGE):$(APP_TAG) $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

binary: $(APP_BINARY)

$(APP_BINARY): main.go
    go build -o $@ $^

Makefile希望与Dockerfile位于同一目录中。

这是一个最小的(有效):

FROM alpine:3.5
ARG APP_BINARY
ADD ${APP_BINARY} /app
ENTRYPOINT /app

我已经测试了在与.file和Dockerfile相同的顶级项目目录中有一个main.go,以防你在一些内部目录中嵌入了一个main.go(“ROOT / cmd / bla”是常见的)然后你应该改变“go build”行来解释它。

虽然我已经做了一段时间这样的事情,但是现在我看到(并且想到)你的问题我已经看到一个专门知道如何做到这一点的专用工具可能很棒。特别是一个模仿“go build / get / install”但可以构建docker镜像的工具......所以你可以运行以下命令来获取二进制文件:

go install github.com/my/program

您还可以运行以下命令来获取简单的泊坞窗图像:

goi install github.com/my/program

听起来怎么样?是否存在类似的东西?我应该开始吗?

答案 1 :(得分:0)

提供base图像(使用GOPATH,godep ...预先配置)。

根据base图像创建Dockerfile,然后用户只需要改变COPY路径。