2017-12-02 108 views
1

我想从我的go应用程序建立一个码头图像。 github回购是私人的。我有点新(去Docker),但我认为通过glide管理的/vendor文件应该避开这个问题?另外为什么码头工必须从github获取所有内容?一切都在当地提供。码头建设去应用程序私人github

命令:

docker build -t testimage . 

Dockerfile

FROM golang:1.8-onbuild 

它未能在上述步骤

exec go get -v -d 
....... 
fatal: could not read Username for 'https://github.com': No such device or address 

我怎样才能解决这个得到什么? Thx

+0

“一切都在本地可用” - 您确定它在构建上下文中吗? –

+0

hm好吧我该怎么做? – Tino

回答

0

如果您需要编译您的代码图像INSIDE容器,请仅使用golang:1.8-onbuild。这对于CI构建通常很有用。否则,避免因为它是一个巨大的形象。

更快的解决方案是在本地构建Go应用程序(例如开发环境)并将最终的Go应用程序复制到非常轻量级的容器。

我会给你我们的标准过程。

  1. 如果本地计算机是一台Mac或Windows,你需要cross-compile您转到代码使用Linux:GOOS=liux GOARCH=amd64 go build -o myapp_linux-amd64linux-amd64只是一个约定,提醒自己该文件是为Linux编译的,而不是Mac或Windows。

  2. 我们还将我们的Go应用程序部署到轻量级的Alpine linux容器。 Alpine现在是创建应用程序的标准Docker镜像。它非常小而安全,但它有一个主要的怪癖;它使用的是musc而不是更常见的glibc作为底层的OS/IO库,因此我们需要更多的编译标志:-a -ldflags '-w -extldflags "-static"'

  3. 作为额外的,我们还删除了开发人员自己的路径使用堆栈跟踪:-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 .

+0

谢谢你的时间解释。井井有条。我会放弃它。我使用Jenkins和Kubernetes。每当repo发生更改时,它都会重新生成映像。我只需要优化来自node ... thx的go内容。顺便说一句:你应该写一篇关于它的博客文章! – Tino

+0

谢谢,我在这里接触到更多的人。 – Alkaline

0

是否还有其他的Dockerfile比其他?你用什么码头命令打开容器?如果你只是试图构建一个docker镜像,那就失败了,除非在Dockerfile中定义,否则不应该与github进行任何交互或授权。

你可以试试这个吗?它将取消官方的Go Alpine图像,并将您引导至交互式终端。

docker run -it golang:1.9.2-alpine3.6 sh 

另外,你也可以使用你的形象。

docker run -it golang:1.8-onbuild sh 

如果可行,问题可能在于Dockerfile,而不是Docker或Go图像。

如果你想了解更多关于Docker和Go结账official repository。我最近也写了关于Docker and Go以及如何快速启动并运行它。

相关问题