docker build go app 私有(private) github

标签 docker go jenkins kubernetes

我正在尝试从我的 go 应用构建一个 docker 镜像。 github 存储库是私有(private)的。我有点新手(和 docker),但我认为通过 glide 管理的 /vendor 文件应该可以解决这个问题?还有为什么 docker 必须从 github 获取所有东西?一切都在本地可用。

命令:

docker build -t testimage .

docker 文件

FROM golang:1.8-onbuild

在这一步失败了

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

我该如何解决这个问题?谢谢

最佳答案

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

一个快得多的解决方案是在本地构建您的 Go 应用程序(例如 dev env)并将最终的 Go 应用程序复制到一个非常轻量级的容器中。

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

  1. 如果您的本地计算机是 Mac 或 Windows,您需要使用以下命令交叉编译 Linux 的 Go 代码: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

您现在可以在您的开发环境中本地构建您的应用,并使用以下 Dockerfile 创建镜像:

FROM alpine:3.6
COPY ./myapp_linux-amd64 /usr/local/bin/myapp

ENTRYPOINT []
CMD /usr/local/bin/myapp

构建它使用:

docker build -t myimagename:tag .

关于docker build go app 私有(private) github,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47610730/

相关文章:

jenkins - 如何参数化 Jenkinsfile 作业

docker - 为什么在基线扫描结束时将dockerized zap挂起?

Docker Swarm 发现仍然相关?

go - 如何使用 vscode 片段生成我自己的返回码?

go - 如何取消延期结单

java - Jenkins 重启后不显示作业

linux - Systemctl 命令出现此错误 : Failed to et D-bus: Unkknown error -1 | Docker Opensuse

linux - 如何配置 logstash 以使用 "stdout"作为输入?

c++ - 运算符与函数行为

ssh - Jenkins Slave Permission 在复制 slave.jar 时被拒绝