我正在尝试为go应用程序构建docker镜像,该应用程序使用来自不同私人gitlab repos的不同go包。当我在本地机器上做这件事时,我必须添加以下命令才能使其工作;
git config --global url.git@gitlab.com:.insteadOf https://gitlab.com/
export GOPRIVATE=*gitlab*
在这种情况下,将使用我的ssh密钥,它运行良好。
现在,我想在构建Docker映像时做同样的事情,但不使用ssh密钥,所以我考虑使用部署令牌(该令牌可以访问gitlab组中的所有repos(。
dockerfile:
FROM golang:1.14 AS builder
...
ARG USER
ARG KEY
RUN git config --global url."https://${USER}:${KEY}@gitlab.com/".insteadOf "https://gitlab.com/"
RUN export GOPRIVATE=*gitlab*
显然,这没有起作用,我变成了以下错误:
Fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled
你能分享一下你对如何使用部署令牌实现它的想法吗?
作为解决方法,我手动克隆repo,然后编辑go mod
文件
RUN git clone https://${USER}:${KEY}@gitlab.com/mygroup/myproject
RUN go mod init gitlab.com/mygroup/go-dns
RUN go mod edit -replace=gitlab.com/mygroup/myproject=./myproject
在我的场景中,这个错误消息的问题是:
fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled
尽管我有:
- 为GitLab/Git正确配置SSH密钥
- 并全局调用CCD_ 2
是:
- CCD_ 3命令出于某种原因在";根路径";CCD_ 4
- 但是Git全局配置指的是CCD_ 5目录
对我来说,解决方案是在`go命令中添加GOPRIVATE
env-var作为前缀,如下所示:
GOPRIVATE=gitlab.com/my-org-name go mod download
请记住,尽管没有设置GOPATH
env var,但我最近的Go安装默认情况下有一个GOPATH
设置,我可以从指向$HOME/go/
的go env
中看到,此处查看env
命令和go env
命令的不同输出:
$ env | grep GOPATH
$ go env | grep -i path
GOPATH="/home/<<MY_USER>>/go"
这意味着像go mod download
这样的命令开始从GitLab中提取repo并将其存储在不同的地方:
- 您的本地Go模块(如预期(
- 这个";特别的";基于
go env
的默认GOPATH
指向/home/<<MY_USER>>/go
- 这甚至是";更特别的";路径
/tmp/...
当不使用GOPRIVATE
时,这种奇怪的路径组合可能是问题的一部分