无GitLab容器注册表时如何导入Docker镜像并关联GitLab Runner
ssh: connect to host user port 22: Connection refused
你执行的scp命令格式存在错误,sudo scp user@user:localFile user@ip:remoteFileLocation中的源地址段user@user第二个字段应为源主机的IP/域名,你误填为用户名user,导致系统尝试连接主机名为user的设备,从而触发上述报错。
如果是从本地向远端GitLab Runner传输文件,正确的scp格式为:scp 本地文件路径 远端用户名@远端RunnerIP:远端存放路径
步骤1:导出本地Docker镜像为tar包
在存放评分镜像的本地设备执行导出命令:docker save -o 自定义镜像包名.tar 镜像名:镜像标签
示例(假设镜像名为homework-grader,标签为v1.0):docker save -o homework-grader.tar homework-grader:v1.0
步骤2:将镜像tar包传输到GitLab Runner主机
使用修正后的scp命令传输,传输前确认对应GitLab Runner已开启SSH服务,你使用的登录用户拥有目标目录的写入权限:scp ./homework-grader.tar runner登录用户名@Runner的IP地址:目标存放目录路径
步骤3:在GitLab Runner上导入镜像
SSH登录到对应Runner主机,进入镜像tar包存放目录,执行导入命令:docker load -i homework-grader.tar
导入完成后可执行docker images命令确认镜像存在,名称、标签和导出时保持一致即可。
步骤4:配置CI文件调用镜像
在作业对应的Git仓库的.gitlab-ci.yml中直接指定该镜像名即可,无需添加registry前缀:
grade_homework: image: homework-grader:v1.0 script: - 执行你的评分逻辑命令
如果Runner数量较多,重复传包效率低,可在内网任意主机搭建轻量私有Docker registry,无需依赖GitLab自带的registry服务:
- 执行
docker run -d -p 5000:5000 --restart=always --name registry registry:2启动私有registry服务 - 给本地评分镜像打标签:
docker tag homework-grader:v1.0 registry主机内网IP:5000/homework-grader:v1.0 - 推送镜像到私有registry:
docker push registry主机内网IP:5000/homework-grader:v1.0 - 所有Runner的CI配置直接调用即可:
image: registry主机内网IP:5000/homework-grader:v1.0
内容的提问来源于stack exchange,提问作者user1868607

