在项目内部重建Docker容器



我有一个项目,结构如下:

  • 码头工人/Dockerfile

  • linux/*
  • 。Xz(内核源代码)

  • * . sh
  • Jenkinsfile

基本上这管道正在建设一个linux内核的码头工人容器。

我们将bitbucket与jenkins和artifactory结合使用。

目前docker镜像的构建是手动的:开发人员在本地构建它并将其推送到artifactory。

管道只拉预构建的docker映像执行。

由于这种手动交互很烦人,所以应该自动进行。

典型的场景可能是这样的:开发人员更改了Dockerfile和其他一些资源。

这要求我们首先重新构建容器,将其推送到artifactory,然后开始构建。

是否有一种使用上述技术的直接方法来做到这一点?

我的方法是(这主要是我自己实现的)根据docker映像的git版本来标记它们。

当上面提到的管道启动时,它会查询上次更改的Dockerfile的git-rev,并尝试拉出

容器。如果这是可能的——很好。否则,运行"docker build"并推送新容器。然后运行内核构建。

这样做合适吗?

选项如下:

选项1

为了确定是否必须构建一个新映像,您可以依赖Jenkins Changeset。您可以检查docker/Dockerfile文件是否与上次构建相比发生了变化,如果是,您可以执行构建步骤或直接跳过它。

另外,当标记图像时,您可以创建两个图像标记。一个带有修订版本(或任何其他唯一标识符)的标记,并将latest标记替换为构建的最新映像。这将允许您在管道的连续步骤中具有简单的逻辑,因为我们知道最新构建映像位于最新标记中。下面是示例管道。

pipeline {
agent any
stages {
stage('BuildImage') {
when { changeset "**/Dockerfile" }
steps {
script {
def image = docker.build("my-image:REVISION", "docker/Dockerfile")
image.push() // Pushes the tagged image with revision
image.push('latest') // Change the tag and push
}
}
}

stage('Other Build') {
steps {
docker.image('my-image:latest').inside {
// Do other stuff within the Docker image
}
}
}

stage('Other Build option 2') {
agent {
docker { image 'node:16.13.1-alpine' }
}
steps {
// Do other stuff within the Docker image
}
}
}
}

选项2

另一个选择是总是用你的Docker文件启动一个新的Jenkins Agent/Container,或者总是构建镜像,然后用容器执行构建命令。这可能是有效Dockerfile如果你频繁变化。下面是示例管道。

pipeline {
agent { dockerfile { dir 'docker' } }
stage('Other Build') {
steps {
// Do other stuff within the Docker image
}
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新