[英]Docker container rebuild inside of a project
我有一個具有以下結構的項目:
碼頭工人/碼頭工人文件
linux/*.xz(內核源代碼)
*.sh
詹金斯文件
基本上,這個管道是在 docker 容器內構建一個 linux 內核。
我們將 bitbucket 與 jenkins 和 artifactory 結合用於 CI/CD。
目前 docker 鏡像的構建是手動的:開發人員在本地構建它並將其推送到工件。
管道僅提取預構建的 docker 映像以供執行。
由於這種手動交互很煩人,因此應該自動化。
典型場景可能如下所示:開發人員更改 Dockerfile 和其他一些資源。
這要求我們首先重建容器,將其推送到工件,然后開始構建。
有沒有使用上述技術的直接方法來做到這一點?
我的方法是(主要是自己的實現)根據 git 版本標記 docker 圖像。
當上述管道啟動時,它會查詢上次更改的 Dockerfile 的 git-rev 並嘗試拉取
容器。 如果這是可能的 - 很好。 否則運行“docker build”並推送新容器。 然后在里面運行內核構建。
這是一個正確的方法嗎?
可能的選項如下。
為了確定是否必須構建新映像,您可以依賴 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
}
}
}
}
另一種選擇是始終使用 Docker 文件啟動新的 Jenkins 代理/容器,或者始終構建映像,然后使用容器執行構建命令。 如果您經常更改 Dockerfile,這可能會很有效。 下面的示例管道。
pipeline {
agent { dockerfile { dir 'docker' } }
stage('Other Build') {
steps {
// Do other stuff within the Docker image
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.