[英]Build/push image from jenkins running in docker
我有兩個 docker 容器——一個運行 jenkins,一個運行 docker registry。 我想從 jenkins 構建/推送圖像到 docker 注冊表。 我如何以簡單安全的方式實現這一目標(意味着沒有黑客攻擊)?
最簡單的方法是確保 jenkins 容器和注冊表容器在同一主機上。 然后,您可以將 docker 套接字掛載到 jenkins 容器上,並使用主機上的 dockerd 將映像推送到注冊表。 /var/run/docker.sock
是dockerd
正在偵聽的 unix 套接字。
通過掛載 docker 套接字,您從該容器運行的任何docker
命令都會像主機一樣執行。
$ docker run -dti --name jenkins -v /var/run/docker.sock:/var/run/docker.sock jenkins:latest
如果您使用管道,則可以安裝此 Docker 插件https://plugins.jenkins.io/docker-workflow ,在 Jenkins 上創建憑據資源,以訪問 Docker 注冊表,並在您的管道中執行此操作:
stage("Build Docker image") {
steps {
script {
docker_image = docker.build("myregistry/mynode:latest")
}
}
}
stage("Push images") {
steps {
script {
withDockerRegistry(credentialsId: 'registrycredentials', url: "https://myregistry") {
docker_image.push("latest")
}
}
}
}
完整示例: https : //pillsfromtheweb.blogspot.com/2020/06/build-and-push-docker-images-with.html
我在 Jenkins docker 容器中使用這種類型的工作流程,好消息是它不需要任何黑客來完成。 有些人使用“docker in docker”來實現這一點,但如果那是你想要走的路線,我無法幫助你,因為我沒有這樣做的經驗。 我將在此處概述如何使用現有的 docker 服務(運行 jenkins 容器的服務)進行構建。
我會做一些假設,因為你沒有指定你的設置是什么樣的:
如果上述任何條件不成立,這很容易修改,但我需要一個基線來開始。
您將需要以下內容:
先決條件/設置
設置它非常簡單。 在讓 Jenkins 訪問主機上正在運行的 docker 服務的情況下,您可以通過以下兩種方式之一進行操作。 1) 通過 TCP 和 2) 通過 docker unix 套接字。 如果您已經讓 docker 監聽 TCP,您只需記下主機的 IP 地址和默認的 docker TCP 端口號(2375 或 2376,具體取決於您是否使用 TLS)以及您可能擁有的 TLS 配置。
如果您不想啟用 docker TCP 服務,它會稍微復雜一些,但您可以使用/var/run/docker.sock
的 UNIX 套接字。 這需要您將掛載套接字綁定到 Jenkins 容器。 您可以在運行 jenkins 時將以下內容添加到運行命令中:
-v /var/run/docker.sock:/var/run/docker.sock
您還需要在主機系統上創建一個與容器中 jenkins 用戶具有相同 UID 的 jenkins 用戶,然后將該用戶添加到 docker 組。
詹金斯
您現在需要一個 Docker 構建/發布插件,例如CloudBees Docker 構建和發布插件,或者根據您的需要使用其他一些插件。 您需要注意以下配置項:
tcp://<HOST_IP>:2375
或unix:///var/run/docker.sock
取決於我們如何進行上述設置。 如果您將 TCP 和 TLS 用於 docker 服務,您需要將您的 Jenkins 實例的 TLS 客戶端證書作為“Docker 主機證書身份驗證”上傳到 Jenkins 中的常用憑據部分。http://<HOST_IP>:32768
或類似內容。 您也可以鏈接容器,但如果您稍后將容器移動到單獨的主機,這將無法輕松擴展。 您還需要在相應的憑據部分添加用於登錄到注冊表的憑據作為用戶名/密碼對。我已經完成了這個精確的設置,所以我會給你一個“tl;dr”版本,因為深入這里超出了 StackOverflow 的范圍:
tini
)。 您需要它來處理信號和進程收割。 這將是您的切入點。supervisord
)包。 通常不建議在容器中運行多個服務,但在這種特殊情況下,您的選擇非常有限。--privileged
標志運行--privileged
容器(DinD 需要它)。感謝您的輸入! 經過一些實驗,我想出了這個。
docker run -d \\ -p 8080:8080 \\ -p 50000:50000 \\ --name jenkins \\ -v
pwd
/data/jenkins:/var/jenkins_home \\ -v /Users/.../.docker/machine/machines/docker:/Users/.../.docker/machine/machines/docker \\ -e DOCKER_TLS_VERIFY="1" \\ -e DOCKER_HOST="tcp://192.168.99.100:2376" \\ -e DOCKER_CERT_PATH="/Users/.../.docker/machine/machines/docker" \\ -e DOCKER_MACHINE_NAME="docker" \\ johannesw/jenkins-docker-cli
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.