Jenkins构建Docker镜像并推送至Harbor仓库的实现

实现Jenkins构建Docker镜像并推送至Harbor仓库主要包括以下步骤:

  1. 准备Dockerfile和相关资源文件

在项目中创建Dockerfile和相关资源文件,在Dockerfile中指定镜像的基础环境和相关依赖,以及打包的程序、文件等,同时也可以设置环境变量等。

例如,一个构建 Node.js 应用程序的 Dockerfile 可以有以下配置:

FROM node:12

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

ENV PORT=8080

EXPOSE 8080

CMD [ "npm", "start" ]
  1. 配置Jenkins

使用Jenkins作为持续集成/部署的工具,需要做一些基本配置,包括添加Docker和Harbor的凭证和配置插件等。此处以Jenkins的官方Docker镜像为例,具体步骤如下:

在Jenkins管理界面添加镜像凭证。

➜  ~ docker run --rm -u root -p 8080:8080 \
--name jenkins \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
-jenkins/jenkins:lts

镜像凭证中需要输入Harbor的用户名和密码,在创建凭证时,也需要将Docker的凭证添加进去。

  1. 编写Jenkinsfile

可选的视觉工作流程规范,不过本次我们会使用Jenkinsfile,也可以用类Jenkinsfile的脚本来代替。

pipeline {
  agent any
  environment {
    DOCKER_REGISTRY = "harbor.example.com"
    DOCKER_REGISTRY_CRED = "harbor-cred"
    DOCKER_IMAGE = "my-image"
    IMAGE_TAG = "${GIT_BRANCH}-${BUILD_ID}"
  }
  stages {
    stage('Build') {
      steps {
        git 'https://github.com/username/my-app'
        script {
          docker.build("${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${IMAGE_TAG}", "-t ${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest .")
        }
      }
      post {
        always {
          cleanWs()
        }
      }
    }
    stage('Publish') {
      steps {
        script {
          docker.withRegistry("https://${DOCKER_REGISTRY}", "${DOCKER_REGISTRY_CRED}") {
            docker.push("${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${IMAGE_TAG}")
            docker.push("${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest")
          }
        }
      }
    }
  }
}

在Docker镜像构建和推送的过程中,我们还需要注意以下几点:

  • 指定Docker镜像的名称和版本
  • 指定Docker镜像构建的路径
  • 在推送Docker镜像时,需要使用docker.withRegistry()和docker.push()方法。

示例1

下面是一个使用Jenkinsfile自动化构建和推送Docker镜像的示例。该示例基于Java编写,使用Maven构建应用程序。Dockerfile文件配置了一个基于OpenJDK 11的Docker镜像。

Dockerfile文件:

FROM openjdk:11

ADD target/my-app.jar my-app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "my-app.jar"]

Jenkinsfile文件:

pipeline {
  agent any
  stages {
    stage('Build') {
      steps {
        git 'https://github.com/username/my-app.git'
        sh 'mvn install'
        sh 'docker build -t my-app .'
      }
    }
    stage('Push') {
      environment {
        registry = 'http://<harbor-host>:<harbor-port>'
        registryCredential = 'harbor'
        dockerImage = ''
      }
      steps{
        sh '/usr/bin/docker login -u $USER -p $PASS $registry'
        sh 'docker tag my-app $registry/$dockerImage'
        sh 'docker push $registry/$dockerImage'
      }
    }
  }
}

示例2

下面是一个使用Declarative Pipeline自动化构建和推送Docker镜像的示例。该示例基于Python编写,使用Pipenv构建应用程序。Dockerfile文件配置了一个基于Python 3.9的Docker镜像。

Dockerfile文件:

FROM python:3.9.6

WORKDIR /app

ADD Pipfile* /app/

RUN pip install pipenv && \
    pipenv install --system --deploy

ADD . /app

EXPOSE 8000

CMD gunicorn myapp:app -w 2 -b 0.0.0.0:8000

Jenkinsfile文件:

pipeline {
  agent any
  environment {
    dockerImage = 'my-app'
    dockerRegistry = 'http://<harbor-host>:<harbor-port>/'
  }
  stages {
    stage('Build') {
      steps {
        git 'https://github.com/username/my-app.git'
        withEnv(["PIPENV_VENV_IN_PROJECT=1"]) {
          sh "pipenv install"
          sh "pipenv run python -m py_compile *.py"
        }
        sh 'docker build -t $dockerRegistry${dockerImage}:${BUILD_NUMBER} .'
      }
    }
    stage('Publish') {
      when {
        branch 'development'
      }
      steps {
        withCredentials([usernamePassword(credentialsId: 'harbor-creds', passwordVariable: 'HARBOR_PASSWORD', usernameVariable: 'HARBOR_USERNAME')]) {
          sh "docker login -u $HARBOR_USERNAME -p $HARBOR_PASSWORD $dockerRegistry"
          sh "docker push $dockerRegistry${dockerImage}:${BUILD_NUMBER}"
        }
      }
    }
  }
}

以上就是基于Jenkins实现构建Docker镜像并推送至Harbor仓库的攻略,可以根据实际需求进行修改。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Jenkins构建Docker镜像并推送至Harbor仓库的实现 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Chrome谷歌浏览器提示adobe flash player已过期怎么办

    以下是“Chrome谷歌浏览器提示adobe flash player已过期怎么办”的完整攻略: Chrome谷歌浏览器提示adobe flash player已过期怎么办 如果您在使用Chrome谷歌浏览器时遇到“adobe flash player已过期”的提示,您可以按照以下步骤进行操作: 更新Chrome浏览器:首先,您需要更新Chrome浏览器。在…

    html 2023年5月18日
    00
  • Win10 Mobile预览版10581中存储设置/SD卡出现乱码怎么办?

    以下是详细的攻略: 问题描述 在Win10 Mobile预览版10581中,有用户反映存储设置中出现了乱码,导致无法正确设置SD卡存储。这个问题可能会对用户的使用造成一定的困扰。 解决办法 方法一:重新格式化SD卡 乱码问题可能是由于SD卡格式不兼容Win10 Mobile系统导致的。因此,我们首先可以尝试重新格式化SD卡来解决问题。步骤如下: 将SD卡插入…

    html 2023年5月31日
    00
  • 浏览繁体中文网站出现乱码的处理方法

    浏览繁体中文网站出现乱码的处理方法 如果你在浏览繁体中文网站时遇到了乱码问题,下面提供几种解决方法: 1. 修改浏览器编码方式 一般来说,如果浏览器的编码方式和繁体中文网站所使用的编码方式不一致,就会出现乱码问题。这时可以手动修改浏览器的编码方式。 步骤 打开繁体中文网站。 在浏览器的菜单栏中选择“查看”或“工具”。 选择“编码”。 在下拉列表中选择“繁體中…

    html 2023年5月31日
    00
  • java生成XML的方法【附demo源码下载】

    Java生成XML的方法 XML是一种非常常用的数据传输格式,而Java提供了多种生成XML的方法,本文将介绍一些Java生成XML的方法,并提供源码示例和使用说明。 Java生成XML方法 以下是一些Java生成XML的方法: 1. 使用Java DOM API Java DOM API可以将XML格式的文件转换为一个DOM对象,然后可以通过调用DOM对象…

    html 2023年5月30日
    00
  • .net 操作xml的简单方法及说明

    .NET操作XML的简单方法及说明 什么是XML? XML(可扩展标记语言)是一种常用的数据交换格式,被广泛应用于互联网和软件开发中。XML使用标记表示数据,类似于HTML,但可以自定义标记,因此具备更高的灵活性和可扩展性。在.NET平台中,提供了许多简单的方法来操作XML。 XML的操作方法 读取XML 在.NET中,可以使用XmlDocument类来读取…

    html 2023年5月30日
    00
  • c#中xml文档注释编译dll引用到其它项目示例

    当我们编写C#程序时,我们可能会写一些类库,供其他程序调用,又或者我们可能会需要使用第三方的类库,而在这些情况下,我们需要使用XML文档注释来为我们的类库或第三方类库提供更详细的文档信息,以便其他程序员更好地使用这些代码。 在使用XML文档注释后,我们还需要将这些注释编译到DLL文件中,以便其他项目能够引用并查看这些注释。下面是实现此功能的步骤和示例说明: …

    html 2023年5月30日
    00
  • hbuilderx怎么设置超时时间属性?hbuilderx设置超时时间属性方法

    HBuilderX是一款基于Electron的跨平台前端开发工具,支持多种前端开发语言和框架。在使用HBuilderX进行开发时,有时需要设置超时时间属性,以便更好地控制请求的响应时间。以下是关于HBuilderX如何设置超时时间属性的攻略: HBuilderX设置超时时间属性方法 打开HBuilderX:首先,打开HBuilderX,进入需要设置超时时间属…

    html 2023年5月17日
    00
  • phpmyadmin显示utf8_general_ci中文乱码的问题终级篇

    下面是关于解决phpmyadmin显示utf8_general_ci中文乱码的问题的完整攻略。 问题描述 在使用phpmyadmin管理MySQL数据库时,可能会出现中文数据显示乱码的情况,尤其是在使用utf8_general_ci字符集时。这主要是由于phpmyadmin对字符集的处理出现了问题。 解决方法 1. 修改php.ini配置文件 在php.in…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部