我正在尝试从我的 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 应用程序复制到一个非常轻量级的容器中。
我会给你我们的标准流程。
如果您的本地计算机是 Mac 或 Windows,您需要使用以下命令
交叉编译
Linux 的 Go 代码: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
您现在可以在您的开发环境中本地构建您的应用,并使用以下 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/