jenkins运行任务报错Failed to initialize解决

发布时间 2023-12-26 18:45:47作者: zhaoguowei12

按照jenkins中文挂网创建了一个创建 Hello World 流水线,使用的示例为Node.js / JavaScript
运行jenkins任务后,提示失败,然后在console output里发现以下错误信息

Failed to initialize: unable to resolve docker endpoint: open D:/Program Files/Git/certs/client/ca.pem: no such file or directory

提示信息为“初始化失败:无法解析docker端点,打开D:/Program Files/Git/certs/client/ca.pem 没有这个文件或文件夹”

根据这个报错,估计是和certs配置有关,目前这个路径的前半部分是我本地的git路径,很奇怪,因为配置里没有配置为这个路径,想了半天,猜测和运行docker命令时是用的git bash终端来运行的有关,所以计划换成powershell试试。

后面换成powershell重新运行docker run 等这些命令,重新生成容器,再尝试运行任务,成功!

img

img

现在是好了,但是也要知道之前为什么是坏的,现在对问题进行进一步分析

首先,解释一下为什么使用git bash运行docker命令生成容器,因为根据官网Docker (jenkins.io)的例子

docker run --name jenkins-docker --rm --detach ^
  --privileged --network jenkins --network-alias docker ^
  --env DOCKER_TLS_CERTDIR=/certs ^
  --volume jenkins-docker-certs:/certs/client ^
  --volume jenkins-data:/var/jenkins_home ^
  --publish 2376:2376 ^
  docker:dind

我把命令复制粘贴到power shell 后运行,报错
img

这里应该比较明显的能看出来,命令换行解析的问题,简单网上搜了一下,知道了power shell不用 ^ 作为命令换行符,而用 ` 符号,当时不想改这些符号,就参考了On macOS and Linux 下的运行例子

docker run \
  --name jenkins-docker \
  --rm \
  --detach \
  --privileged \
  --network jenkins \
  --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  --publish 2376:2376 \
  docker:dind \
  --storage-driver overlay2

然后用git bash 运行,运行后是成功的,jenkins可以正常起来,但是跑任务时就会提示上面的找不到文件的报错。

因为报错内容和certs相关,所以我就查看了docker中的jenkins-docker-certs数据卷,发现了如果用git bash运行,数据卷中为空,用cmd或者power shell运行,数据卷中有文件。所以猜测和docker命令运行时底层解析有关,目前只能查到这了,在往下深入目前没什么头绪。

这里回头再来看下问题发生的地方,官网给的例子中 ^ 符号是用在哪里呢,powser shell中不生效,那应该就是cmd了,在cmd尝试,运行成功,果然是因为我没在cmd里运行才导致的换行命令解析的错误。

img

经过验证,^ 确实是cmd中命令的换行符,所以这里简单做一个知识总结:

终端 命令换行符
windows cmd ^
windows powershell ` 反引号,键盘左侧数字1的左边
git bash 或者linux \

因为我印象中官网也没要求用cmd还是powershell,所以我再回顾文档确认一下,发现了第一句:

Open up a command prompt window and similar to the macOS and Linux instructions above do the following:

翻译成中文为:“打开命令提示符窗口,类似于上面的macOS和Linux指令,执行以下操作:”
然后我在本地搜了一下“command”或者“命令提示符”,显示如下:
img

尴尬了,命令提示符就是平常用的cmd,我当时没仔细看这一行,想着随便找个终端都可以,真是不仔细看文档惹的祸,以后真是要仔细看文档。

问题总结:git bash运行docker 命令导致的问题,改为cmd即可解决。