我有一個 Jenkins 構建,它使用:
stage("Build docker images and start containers") {
steps {
sh "docker-compose build "
sh "docker-compose up -d"
}
}
docker compose 檔案有很多容器、網路和卷,通常很難維護和集成到基于 docker 的管道中。
另一方面,Jenkins 中的 docker 物件提供了一些不錯的功能,我也希望從中受益。
但無論我嘗試什么,我似乎都不可能在管道中創建一個參考已經存在/正在運行的 docker 容器的 docker 物件。例如我試過(為了這個問題的最小例子):
node {
checkout scm
def runningContainer = docker.build("my-image:${env.BUILD_ID}")
runningContainer.inside {
sh 'make test'
}
}
但在這種情況下,它會從頭開始構建映像,然后運行命令。我也試過:
node {
checkout scm
docker.image('mysql:5').withRun('-p 3306:3306') {
/* do things */
}
}
但在這種情況下也是一樣的。創建/使用影像,然后運行代碼。
有什么方法可以從現有的 docker 容器創建物件,例如:
node {
checkout scm
runningContainer = docker.reference('already_running_container_name')
runningContainer.inside {
sh 'make test'
}
}
預先感謝您的幫助!
uj5u.com熱心網友回復:
您在此處可用的兩個工具docker.image().withRun()可以采用任意額外docker run選項,并且您可以sh 'docker ...'運行任意命令來執行標準 Jenkins Docker 集成不支持的操作。它還有助于 Compose 創建具有可預測(或手動設定)名稱的普通 Docker 物件。
相反,如果你從一個docker.image().inside() { ... }命令中查看 Jenkins 日志,你會發現它注入了很多設定;足夠的系結掛載和環境變數,容器內部的環境看起來或多或少類似于容器外部的環境。我不會嘗試在其他地方重現這一點,也不會嘗試合并 Compose 和 Jenkins 容器設定。
實際上,我希望您需要 Compose 的大部分內容是它的default網路。您通常不需要卷掛載,因為 Jenkins 掛載了作業區目錄。在運行測驗時,可以忽略從 Compose 獲得的其他配置。
所以 Jenkinsfile 可能看起來像(腳本化的管道語法):
// Assign a unique (and known) Compose project name
def projectName = env.BUILD_TAG
try {
// Start up the Compose stack
sh "docker-compose -p ${projectName} up --build -d"
// (Consider limiting to dependencies only, without --build)
// sh "docker-compose -p ${projectName} up -d mysql redis"
// Build an image out of the service we're testing
def image = docker.build("my-image:${env.BUILD_ID}")
// Run the integration tests, attached to the Compose-provided network
// (This is the `docker run --network` option)
image.inside("--network ${projectName}_default") {
sh 'make test'
}
} finally {
// Tear down the Compose stack
sh "docker-compose -p ${projectName} down"
}
原則上你可以sh 'docker-compose exec ...',但你不會有任何 Jenkins 提供的卷掛載,相應地你很難得到像 JUnit 格式的測驗報告這樣的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430869.html
標籤:码头工人 詹金斯 码头工人撰写 詹金斯管道 詹金斯插件
