实现Jenkins构建Docker镜像并推送至Harbor仓库主要包括以下步骤:
- 准备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" ]
- 配置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的凭证添加进去。
- 编写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技术站