Harbor私服仓库镜像推送失败
Harbor私服仓库镜像推送失败
问题描述:push镜像时443连接拒绝
问题1
-
背景:Jenkins配置了SSH Server后进行自动化镜像构建,已设置镜像构建及推送命令,命令如下:
-
mv target/*.jar docker/ docker build -t demo:$tag docker/ ##将Gitlab项目打包为镜像 docker login -u fang -p Fang@123 192.168.109.5:80 docker tag demo:$tag 192.168.109.5/fang/demo:$tag #为镜像打标签,以便推送至镜像仓库 docker push 192.168.109.5/fang/demo:$tag -
但Jenkins在进行项目构建时失败,报错内容如下。
#失败报错1:
+ docker login -u fang -p Fang@123 192.168.109.5:80
Login Succeeded
+ docker tag demo:fang_v1.0.3 192.168.109.5/fang/demo:fang_v1.0.3
+ docker push 192.168.109.5/fang/demo:fang_v1.0.3
The push refers to repository [192.168.109.5/fang/demo]
Get "https://192.168.109.5/v2/": dial tcp 192.168.109.5:443: connect: connection refused
Build step 'Execute shell' marked build as failure
Finished: FAILURE
解决方法及思路(未生效)
此时我猜测是Jenkins的配置文件问题导致推送镜像失败,因此搜索解决方法,解决方法共分为两类。
方法一(最多):
在Jenkins服务器中为仓库地址配置私有镜像仓库
cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.109.5:80"]
}
方法二:
修改docker配置文件,添加仓库地址
vim /usr/lib/systemd/system/docker.service
#第17行中间加入
ExecStart=/usr/bin/dockerd --insecure-registry xxx.xxx.xxx.xxx
修改文件后都需要重启docker
systemctl daemon-reload && systemctl restart docker
但以上两种方法都未生效。
最终解决方法(可行)
- 分析:
以上两种解决方案未生效后,猜测是其他原因,准备对构建失败的过程逐步排查。
- 抓包监听Harbor端口
首先在Harbor服务器使用tcpdump抓包监听主机的80端口流量(主机与Harbor容器的端口映射关系为80:8080)
tcpdump -i any port 80 -nn -AA
监听后重新在Jenkins服务器进行镜像推送(此时不在Jenkins中进行构建,因为问题已定位至推送镜像步骤,手动推送测试,省去构建步骤)
docker tag hello-world:latest 192.168.109.5/fang/hello-world:latest
docker push 192.168.109.5/fang/hello-world:latest
依旧报错:Get "https://192.168.109.5/v2/": dial tcp 192.168.109.5:443: connect: connection refused,但是Harbor服务器并未监听到流量,此时意识到push请求根本的未到达Harbor服务器,问题很可能出在Jenkins服务器的docker配置上,因此继续查询解决方法,了解到docker会将http请求自动重定向为https。
- 将登录仓库及推送操作指定为http80端口(成功解决)
docker logout 192.168.109.5:80
docker login -u fang -p Fang@123 http://192.168.109.5:80
docker tag demo:$tag 192.168.109.5:80/fang/demo:$tag
docker push 192.168.109.5:80/fang/demo:$tag
问题2
问题描述
指定80端口后可进行镜像推送了,但是在Jenkins进行构建时又出现了新bug
SSH: Connecting from host [d8c800f9f7e9]
SSH: Connecting with configuration [192.168.109.4] ...
SSH: EXEC: completed after 4,616 ms
SSH: Disconnecting configuration [192.168.109.4] ...
ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [255]]
Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE
[fang] $ /bin/sh -xe /tmp/jenkins1832432942589451064.sh
+ mv target/hello-0.0.1-SNAPSHOT.jar docker/
+ docker build -t demo:fang_v1.0.3 docker/
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
Install the buildx component to build images with BuildKit:
https://docs.docker.com/go/buildx/
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=demo%3Afang_v1.0.3&target=&ulimits=%5B%5D&version=1": dial unix /var/run/docker.sock: connect: permission denied
Build step 'Execute shell' marked build as failure
Finished: FAILURE
问题显示是对/var/run/docker.sock权限不足被拒绝。
分析问题:虽然Jenkins的任务执行用户是root,但是在进行镜像构建及推送时是在Jenkins的容器内部进行,通过whoami也可确定用户为jenkins。
ll /var/run/docker.sock srw-rw---- 1 root docker 0 Jun 6 09:47 /var/run/docker.sock
#/var/run/docker.sock解释
Docker守护进程通过/var/run/docker.sock套接字文件与客户端(如docker命令)通信。默认情况下,这个文件的权限通常被设置为仅允许root用户和docker组的成员访问。
解决:
发现docker组用户对该文件没有读写权限,问题定位,因此为docker用户组添加权限
chmod 666 /var/run/docker.sock
sudo chown root:root /var/run/docker.sock
sudo chmod o+rw /var/run/docker.sock #o 表示“others”(其他用户,即不属于文件所有者或文件所属组的用户)。
总结:
对CI/CD流程的原理掌握不够深入,导致在出现问题时只能通过常规的报错排查思路进行解决,因此需要对问题解决方案进行记录。

浙公网安备 33010602011771号