我正在尝试根据以下内容设置詹金斯管道 this文章,而是使用谷歌容器注册表将docker镜像推送到。
问题:让我失望的部分是这个 jenkinsfile 阶段块
stage ('Push Docker Image To Container Registry') {
docker.image('google/cloud-sdk:alpine').inside {
sh "echo ${env.GOOGLE_AUTH} > gcp-key.json"
sh 'gcloud auth activate-service-account --key-file ./service-account-creds.json'
}
}
错误:
Please verify that you have permissions to write to the parent directory.)
ERROR: (gcloud.components.update) Could not create directory [/.config/gcloud]: Permission denied.
我无法运行任何与 gcloud 相关的命令,因为我一直收到上述错误。
我尝试创建手动登录到aws实例的“/.config”目录并向所有人开放该文件夹的权限,但这也没有帮助。
我也找不到任何地方如何使用docker为jenkins管道正确设置谷歌云。
非常感谢任何建议:)
看起来它正在尝试将数据直接写入您的根文件系统目录。 gcloud 的 .config 目录通常位于用户名和/或 root 用户的以下位置:
/home/yourusername/.config/gcloud
/root/.config/gcloud
看起来,出于某种原因,jenkins 认为父目录应该位于 / 中。
我会尝试检查您运行此程序的计算机上的云 SDK 配置目录(以及脚本运行的用户):
$ sudo find / -iname "gcloud"
并寻找与上面打印的位置类似的位置。
难道Cloud SDK安装在机器上非标准位置?
所以问题是,当 Jenkins 运行 docker 容器时,它会传递主机上用户的用户 ID,例如:
docker run -t -d -u 501:501 \
-w /home/worker/workspace/vcg-gcp-image-build \
-v /home/worker/workspace/vcg-gcp-image-build:/home/worker/workspace/vcg-gcp-image-build:rw,z \
-v /home/worker/workspace/vcg-gcp-image-build@tmp:/home/worker/workspace/vcg-gcp-image-build@tmp:rw,z \
-e CLOUDSDK_CONFIG=/tmp/.config/gcloud \
-e ******** \
...
该用户(在本例中为
501
)可能不存在于docker容器上,因此它实际上没有主目录或类似的东西,但它以普通用户身份运行,而不是root
,所以它赢了没有权限写信给 /
(或者特别是 /.config/gcloud
)。我认为用户将有权 /home/worker/...
;然而,对我来说似乎并非如此。
我通过将
CLOUDSDK_CONFIG = '/tmp/.config/gcloud'
设置为管道的环境变量,然后传递 args "-e CLOUDSDK_CONFIG=${CLOUDSDK_CONFIG}"
告诉 gcloud
使用不同的目录来解决这个问题。我们的管道看起来像这样:
CLOUDSDK_CONFIG
看起来我迟到了 6 年多才来帮助你,但希望这对未来的其他人有帮助。