簡體   English   中英

從在 docker 中運行的 jenkins 構建/推送圖像

[英]Build/push image from jenkins running in docker

我有兩個 docker 容器——一個運行 jenkins,一個運行 docker registry。 我想從 jenkins 構建/推送圖像到 docker 注冊表。 我如何以簡單安全的方式實現這一目標(意味着沒有黑客攻擊)?

最簡單的方法是確保 jenkins 容器和注冊表容器在同一主機上。 然后,您可以將 docker 套接字掛載到 jenkins 容器上,並使用主機上的 dockerd 將映像推送到注冊表。 /var/run/docker.sockdockerd正在偵聽的 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 容器的服務)進行構建。

我會做一些假設,因為你沒有指定你的設置是什么樣的:

  • 您在同一主機上運行兩個容器
  • 你沒有使用 docker-compose
  • 您沒有運行 docker swarm(或 swarm 模式)
  • 你在 Linux 上使用 docker

如果上述任何條件不成立,這很容易修改,但我需要一個基線來開始。

您將需要以下內容:

  • 從 Jenkins 容器訪問主機上運行的 docker
  • 從 Jenkins 容器訪問 registry 容器

先決條件/設置

設置它非常簡單。 在讓 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 構建和發布插件,或者根據您的需要使用其他一些插件。 您需要注意以下配置項:

  • Docker URI/URL 將類似於tcp://<HOST_IP>:2375unix:///var/run/docker.sock取決於我們如何進行上述設置。 如果您將 TCP 和 TLS 用於 docker 服務,您需要將您的 Jenkins 實例的 TLS 客戶端證書作為“Docker 主機證書身份驗證”上傳到 Jenkins 中的常用憑據部分。
  • Docker Registry URL 將是注冊表容器的 URL,而不是 localhost。 根據您的配置,它可能類似於http://<HOST_IP>:32768或類似內容。 您也可以鏈接容器,但如果您稍后將容器移動到單獨的主機,這將無法輕松擴展。 您還需要在相應的憑據部分添加用於登錄到注冊表的憑據作為用戶名/密碼對。

我已經完成了這個精確的設置,所以我會給你一個“tl;dr”版本,因為深入這里超出了 StackOverflow 的范圍:

  • 在容器中安裝 PID1 處理程序文件(即tini )。 您需要它來處理信號和進程收割。 這將是您的切入點。
  • 安裝一些過程控制服務(即supervisord )包。 通常建議在容器中運行多個服務,但在這種特殊情況下,您的選擇非常有限。
  • 安裝 Java/Jenkins 包或從他們的 DockerHub 鏡像建立你的鏡像。
  • 添加 dind (Docker-in-Docker) 包裝器腳本。 是我的配置的基礎。
  • 為流程控制服務創建配置以啟動 Jenkins(作為 jenkins 用戶)和 dind 包裝器(作為 root)。
  • 將 jenkins 用戶添加到 Dockerfile 中的 docker 組
  • 使用--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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM