如果您需要编译您的代码图像INSIDE容器,请仅使用golang:1.8-onbuild
。这对于CI构建通常很有用。否则,避免因为它是一个巨大的形象。
更快的解决方案是在本地构建Go应用程序(例如开发环境)并将最终的Go应用程序复制到非常轻量级的容器。
我会给你我们的标准过程。
如果本地计算机是一台Mac或Windows,你需要cross-compile
您转到代码使用Linux:GOOS=liux GOARCH=amd64 go build -o myapp_linux-amd64
。 linux-amd64
只是一个约定,提醒自己该文件是为Linux编译的,而不是Mac或Windows。
我们还将我们的Go应用程序部署到轻量级的Alpine linux容器。 Alpine现在是创建应用程序的标准Docker镜像。它非常小而安全,但它有一个主要的怪癖;它使用的是musc而不是更常见的glibc作为底层的OS/IO库,因此我们需要更多的编译标志:-a -ldflags '-w -extldflags "-static"'
作为额外的,我们还删除了开发人员自己的路径使用堆栈跟踪:-gcflags=-trimpath=$(pwd) -asmflags=-trimpath=$(pwd)
产生的编译,我们使用的命令是: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOROOT_FINAL=$(pwd) go build -a -ldflags '-w -extldflags "-static"' -gcflags=-trimpath=$(pwd) -asmflags=-trimpath=$(pwd) -o myapp_linux-amd64
现在,您可以在您的开发ENV本地建立你的应用程序,并使用创建映像以下Dockerfile:
它使用
FROM alpine:3.6
COPY ./myapp_linux-amd64 /usr/local/bin/myapp
ENTRYPOINT []
CMD /usr/local/bin/myapp
编译:
go build -t myimagename:tag .
“一切都在本地可用” - 您确定它在构建上下文中吗? –
hm好吧我该怎么做? – Tino