jenkins 推送到Google容器注册表失败:重试

twh00eeo  于 2023-03-01  发布在  Jenkins
关注(0)|答案(7)|浏览(209)

我正在尝试从我的Jenkins推送到Google容器注册表。构建在Kubernetes Jenkins插件中运行,该插件使用gcr.io/cloud-solutions-images/jenkins-k8s-slave将Docker映像构建到Kubernetes本地Docker中。
在通过Google容器注册表的验证后,我尝试推送新创建的映像。

def imageTag = 'gcr.io/project-id/tag'

def version = version from pom 

sh './mvnw package'

sh "docker build -t $imageTag:$version ."

sh('gcloud auth activate-service-account --key-file=$FILE')

sh('docker login -p $(gcloud auth print-access-token) -u _token https://gcr.io')

sh("gcloud docker -- push $imageTag:$version")

推送失败,并显示以下输出:

c6ff94654483: Preparing
209db64c273a: Preparing
762429e05518: Preparing
2be465c0fdf6: Preparing
5bef08742407: Preparing
c6ff94654483: Retrying in 5 seconds
5bef08742407: Retrying in 5 seconds
209db64c273a: Retrying in 5 seconds
2be465c0fdf6: Layer already exists
762429e05518: Layer already exists
c6ff94654483: Retrying in 4 seconds
5bef08742407: Retrying in 4 seconds
209db64c273a: Retrying in 4 seconds
c6ff94654483: Retrying in 3 seconds
5bef08742407: Retrying in 3 seconds
209db64c273a: Retrying in 3 seconds
c6ff94654483: Retrying in 2 seconds
5bef08742407: Retrying in 2 seconds
209db64c273a: Retrying in 2 seconds
c6ff94654483: Retrying in 1 second
5bef08742407: Retrying in 1 second
209db64c273a: Retrying in 1 second
5bef08742407: Retrying in 10 seconds
...
unexpected EOF
lxkprmvk

lxkprmvk1#

这个问题的根本原因是您的docker守护进程没有使用推送到gcr.io所需的凭据进行身份验证。对于最初的问题,我认为这很可能是因为使用的用户帐户是_token而不是oauth2accesstoken
我遇到了一个类似的错误,除了我使用的是docker-credential-gcr而不是docker login,并且得到了相同的unexpected EOF错误。
我的问题是我运行在GCE上,docker-credential-gcr通过GCE元数据API从GCE检测和使用不同的服务帐户。
因此,对于运行在GCP上并尝试通过docker-credential-gcr验证服务帐户的其他遇到此问题的人,您需要告诉它只查看gcloud凭据,而不是查看元数据API细节的环境。
gcloud auth activate-service-account --key-file=$FILE
docker-credential-gcr configure-docker --token-source="gcloud"
docker push gcr.io/....
希望能帮上忙。

wbgh16ku

wbgh16ku2#

检查标记中是否使用了正确的projectID,因为它已在Cannot push image to repository in Google Container Engine中解决

g9icjywg

g9icjywg3#

对于那些在将构建推送到GCR时遇到问题的人来说,我的错误在于我使用了项目名称而不是项目ID。
感谢https://forums.docker.com/t/cannot-push-image-to-repository-in-google-container-engine/12662帮助我进行排序

23c0lvtd

23c0lvtd4#

在我的例子中,我观察到一个类似的“重试”问题时,试图以各种方式推到GCR,已安装Jenkins的GKE每个谷歌云服务packaged tutorial
我使用默认的服务帐户来处理这个问题。这继承了GCE集群OAuth作用域,默认情况下,这些作用域没有云存储的写入权限。Google云控制台在Kubernetes集群的权限下显示了这一点。它显示Storage: Read Only,不幸的是它不能更改。
最后,我按照this excellent article中的描述添加了一个新的节点池,然后删除了原来的节点池。
完成此操作后,推送工作正常,GKE集群上的Permissions列表显示Storage: Read Write

n3ipq98p

n3ipq98p5#

或者,也可以通过以下命令使用密钥文件进行Docker登录并推送到注册表:

docker login -u _json_key --password-stdin https://eu.gcr.io < $FILE
 docker push eu.gcr.io/<PROJECT_ID>/<IMAGE_NAME>:<VERSION>

这对我很有效。

pxy2qtax

pxy2qtax6#

执行此命令并更新docker中的config.json

gcloud auth configure-docker asia-docker.pkg.dev
des4xlb0

des4xlb07#

请检查是否
sh“docker构建版本--无缓存-t $图像标记:$版本。”
解决它

相关问题