Jenkins Pipeline中Docker镜像构建与推送的常见问题及解决方案

 更新时间:2025年01月15日 09:07:16   作者:码农阿豪@新空间代码工作室  
在现代 DevOps 实践中,Jenkins 作为一款流行的持续集成和持续交付(CI/CD)工具,被广泛应用于自动化构建、测试和部署流程,然而,在实际使用 Jenkins Pipeline 进行 Docker 镜像构建和推送的过程中,可能会遇到各种问题,本文将通过一个具体的案例给大家详细的介绍一下

引言

在现代 DevOps 实践中,Jenkins 作为一款流行的持续集成和持续交付(CI/CD)工具,被广泛应用于自动化构建、测试和部署流程。Docker 作为一种轻量级的容器化技术,能够帮助开发团队快速构建、发布和运行应用程序。将 Jenkins 与 Docker 结合使用,可以极大地提高软件交付的效率和质量。

然而,在实际使用 Jenkins Pipeline 进行 Docker 镜像构建和推送的过程中,可能会遇到各种问题。本文将通过一个具体的案例,详细分析 Jenkins Pipeline 中 Docker 镜像构建与推送的常见问题,并提供解决方案。

案例背景

以下是一个 Jenkins Pipeline 脚本的片段,用于构建 Docker 镜像并将其推送到远程仓库:

stage('Build Docker'){
    steps{
        echo "Build Docker Image Stage"
        sh "docker build -t advertise.tencentcloudcr.com/advertise/${SERVER_NAME}:${build_tag} ."
    }
}

stage('Push'){
    steps{
        echo "4. Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: 'tencentcloudcr', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
            sh "docker login advertise.tencentcloudcr.com --username ${USERNAME} --password ${PASSWORD} "
            sh "docker push advertise.tencentcloudcr.com/advertise/${SERVER_NAME}:${build_tag}"
            sh "docker rmi \$(docker images -q)"
        }
    }
}

该脚本分为两个阶段:

  • Build Docker:构建 Docker 镜像。
  • Push:登录远程 Docker 仓库,推送镜像,并清理本地镜像。

在实际运行中,该脚本可能会遇到以下问题:

问题 1:无法连接到 Docker 守护进程

错误信息

ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

问题分析

该错误表明 Jenkins 无法连接到 Docker 守护进程(Docker daemon)。可能的原因包括:

  1. Docker 服务未启动。
  2. Jenkins 用户没有权限访问 Docker 的 Unix 套接字文件 /var/run/docker.sock
  3. Jenkins 运行在容器中,未挂载 Docker 套接字。

解决方案

  • 启动 Docker 服务
sudo systemctl start docker
  • 授予 Jenkins 用户权限
sudo usermod -aG docker jenkins
sudo systemctl restart jenkins
  • 挂载 Docker 套接字(如果 Jenkins 运行在容器中):
docker run -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 jenkins/jenkins:lts

问题 2:镜像被停止的容器占用

错误信息

Error response from daemon: conflict: unable to delete 583207f3c64e (must be forced) - image is being used by stopped container 90eceb6d5a9c

问题分析

该错误表明镜像 583207f3c64e 被一个已停止的容器 90eceb6d5a9c 占用,导致无法直接删除。

解决方案

  • 删除占用镜像的容器
docker rm -f 90eceb6d5a9c
  • 强制删除镜像
docker rmi -f 583207f3c64e

问题 3:镜像被多个仓库引用

错误信息

Error response from daemon: conflict: unable to delete 27b858cdcd8a (must be forced) - image is referenced in multiple repositories

问题分析

该错误表明镜像 27b858cdcd8a 被多个仓库引用,导致无法直接删除。

解决方案

  • 强制删除镜像
docker rmi -f 27b858cdcd8a
  • 清理未使用的镜像
docker image prune -a -f

问题 4:Docker 登录密码安全性问题

错误信息

Warning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.
WARNING! Using --password via the CLI is insecure. Use --password-stdin.

问题分析

该警告表明在 Jenkins Pipeline 中直接使用 Groovy 字符串插值传递密码是不安全的。

解决方案

使用 --password-stdin 方式传递密码:

echo ${PASSWORD} | docker login --username ${USERNAME} --password-stdin advertise.tencentcloudcr.com

优化后的 Jenkins Pipeline 脚本

结合上述问题和解决方案,以下是优化后的 Jenkins Pipeline 脚本:

stage('Build Docker'){
    steps{
        echo "Build Docker Image Stage"
        sh "docker build -t advertise.tencentcloudcr.com/advertise/${SERVER_NAME}:${build_tag} ."
    }
}

stage('Push'){
    steps{
        echo "4. Push Docker Image Stage"
        withCredentials([usernamePassword(credentialsId: 'tencentcloudcr', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
            sh "echo ${PASSWORD} | docker login --username ${USERNAME} --password-stdin advertise.tencentcloudcr.com"
            sh "docker push advertise.tencentcloudcr.com/advertise/${SERVER_NAME}:${build_tag}"
            sh "docker rm -f \$(docker ps -aq) || true"  # 强制删除所有容器
            sh "docker rmi -f \$(docker images -q) || true"  # 强制删除所有镜像
        }
    }
}

总结

在 Jenkins Pipeline 中构建和推送 Docker 镜像时,可能会遇到多种问题,例如无法连接到 Docker 守护进程、镜像被占用或引用、密码安全性问题等。通过分析问题的根本原因,并采取相应的解决方案(如启动 Docker 服务、授予权限、强制删除镜像、优化密码传递方式等),可以确保 Pipeline 的顺利执行。

此外,优化 Jenkins Pipeline 脚本,添加错误处理逻辑(如 || true),可以避免因清理步骤失败而导致整个 Pipeline 失败的情况。通过这些实践,开发团队可以更高效地利用 Jenkins 和 Docker,实现持续集成和持续交付的目标。

希望本文的内容能够帮助读者更好地理解和解决 Jenkins Pipeline 中 Docker 镜像构建与推送的常见问题。如果你有其他问题或建议,欢迎留言讨论!

以上就是Jenkins Pipeline中Docker镜像构建与推送的常见问题及解决方案的详细内容,更多关于Jenkins Pipeline Docker镜像构建与推送的资料请关注脚本之家其它相关文章!

相关文章

  • docker部署fastapi的实现步骤

    docker部署fastapi的实现步骤

    本文主要介绍了docker部署fastapi的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • docker 查询或获取私有仓库(registry)中的镜像的方法

    docker 查询或获取私有仓库(registry)中的镜像的方法

    这篇文章主要介绍了docker 查询或获取私有仓库(registry)中的镜像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Docker搭建RabbitMq的普通集群和镜像集群的详细操作

    Docker搭建RabbitMq的普通集群和镜像集群的详细操作

    这篇文章主要介绍了Docker搭建RabbitMq的普通集群和镜像集群,我本机是window10,通过docker搭建两个rabbitmq节点,本文给大家介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • Docker容器中的OpenCV如何轻松构建可移植的计算机视觉环境

    Docker容器中的OpenCV如何轻松构建可移植的计算机视觉环境

    计算机视觉是一门涉及图像和视频处理的领域,可以应用于目标检测、图像识别、人脸识别等各种任务,本文给大家介绍Docker容器中的OpenCV如何轻松构建可移植的计算机视觉环境,感兴趣的朋友一起看看吧
    2023-12-12
  • Docker部署UI自动化测试环境的实现步骤

    Docker部署UI自动化测试环境的实现步骤

    本文主要介绍了Docker部署UI自动化测试环境的实现步骤,通过Docker可以快速创建、部署和测试脚本,提高测试效率,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • AntDesign Docker部署详细流程

    AntDesign Docker部署详细流程

    这篇文章主要为大家介绍了AntDesign Docker部署流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 详解docker API管理接口增加CA安全认证

    详解docker API管理接口增加CA安全认证

    这篇文章主要介绍了docker API管理接口增加CA安全认证,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • docker安装使用xdebug的过程

    docker安装使用xdebug的过程

    这篇文章主要介绍了docker安装使用xdebug的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 解决docker访问外部https数字证书问题

    解决docker访问外部https数字证书问题

    这篇文章主要介绍了docker访问外部https数字证书问题,为了解决证书验证的问题,我们需要在构建 docker 镜像的时候将 ca-certificates 根证书装上,需要的朋友可以参考下
    2022-09-09
  • docker内部ping和ip命令的使用方式

    docker内部ping和ip命令的使用方式

    这篇文章主要介绍了docker内部ping和ip命令的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论