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

但以上两种方法都未生效。

最终解决方法(可行)

  1. 分析:

以上两种解决方案未生效后,猜测是其他原因,准备对构建失败的过程逐步排查。

  1. 抓包监听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。

  1. 将登录仓库及推送操作指定为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流程的原理掌握不够深入,导致在出现问题时只能通过常规的报错排查思路进行解决,因此需要对问题解决方案进行记录。

posted @ 2025-06-06 18:15  FangNing  阅读(129)  评论(0)    收藏  举报