Docker Hub 上提供了 Jenkins 持續整合和交付伺服器。
這是一個功能齊全的 Jenkins 伺服器。 https://jenkins.io/。
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
注意:請閱讀下面的連接代理部分,以了解50000
連接埠對映的作用。注意:如果您看到「此 Jenkins 實例似乎已離線」訊息,請閱讀DNS 設定部分。
這會將工作區儲存在/var/jenkins_home
中。所有 Jenkins 資料都存放在那裡 - 包括插件和配置。您可能希望將其設為顯式捲,以便可以管理它並附加到另一個容器進行升級:
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk17
這將自動在主機上建立一個「jenkins_home」docker 磁碟區。即使容器停止、啟動或刪除,Docker 磁碟區也會保留其內容。
注意:避免使用從主機上的資料夾綁定掛載到/var/jenkins_home
,因為這可能會導致檔案權限問題(容器內使用的使用者可能無權存取主機上的資料夾)。如果確實需要綁定掛載 jenkins_home,請確保容器內的 jenkins 使用者(jenkins 使用者 - uid 1000)可以存取主機上的目錄,或在docker run
中使用-u some_other_user
參數。
docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
這將以分離模式運行 Jenkins,並新增連接埠轉送和磁碟區。您可以使用命令「docker logs CONTAINER_ID」存取日誌,以檢查第一個登入令牌。容器的 ID 將從上述命令的輸出中傳回。
如果您在磁碟區中綁定掛載 - 您可以隨時備份該目錄(即 jenkins_home)。
不建議使用綁定安裝,因為它可能導致權限問題。將 jenkins_home 目錄視為資料庫 - 在 Docker 中,您通常會將資料庫放在磁碟區上。
如果您的磁碟區位於容器內 - 您可以使用docker cp $ID:/var/jenkins_home
指令來提取數據,或使用其他選項來尋找磁碟區資料的位置。請注意,某些作業系統上的某些符號連結可能會轉換為副本(這可能會將 jenkins 與 lastStableBuild 連結等混淆)
有關更多信息,請查看 Docker 文件中有關使用卷的部分
您可以使用 groovy 腳本定義 Jenkins 內建節點上的執行器數量。預設情況下,它設定為 2 個執行程序,但您可以擴展映像並將其更改為您所需的執行程序數量(建議內建節點上使用 0 個執行程序):
executors.groovy
import jenkins.model.* Jenkins.instance.setNumExecutors(0) // Recommended to not run builds on the built-in node
和Dockerfile
FROM jenkins/jenkins:lts COPY --chown=jenkins:jenkins executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy
您可以在開箱即用的控制器上執行建置。 Jenkins 專案建議不要在控制器上啟用執行程序。
為了透過入站 TCP 連線來連接代理,請對應連接埠: -p 50000:50000
。當您將代理連接到控制器時,將使用該連接埠。
如果您僅使用 SSH(出站)建立代理,則不需要此端口,因為連接是從控制器建立的。如果使用 Web 套接字連接代理程式(自 Jenkins 2.217 起),則也不會使用 TCP 代理連接埠。
您可能需要自訂執行 Jenkins 的 JVM,通常是為了調整系統屬性或調整堆記憶體設定。為此目的,請使用JAVA_OPTS
或JENKINS_JAVA_OPTS
環境變數:
docker run --name myjenkins -p 8080:8080 -p 50000:50000 --restart=on-failure --env JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com jenkins/jenkins:lts-jdk17
專門針對 Jenkins 控制器的 JVM 選項應透過JENKINS_JAVA_OPTS
設置,因為其他工具也可能回應JAVA_OPTS
環境變數。
Jenkins 日誌記錄可以透過屬性檔案和java.util.logging.config.file
Java 屬性進行設定。例如:
mkdir data cat > data/log.properties <<EOF handlers=java.util.logging.ConsoleHandler jenkins.level=FINEST java.util.logging.ConsoleHandler.level=FINEST EOF docker run --name myjenkins -p 8080:8080 -p 50000:50000 --restart=on-failure --env JAVA_OPTS="-Djava.util.logging.config.file=/var/jenkins_home/log.properties" -v `pwd`/data:/var/jenkins_home jenkins/jenkins:lts-jdk17
如果你想在反向代理後面安裝 Jenkins,例如:mysite.com/jenkins,你需要加入JENKINS_OPTS="--prefix=/jenkins"
反向代理,這取決於您是否有Apache 或Nginx:
阿帕契
nginx
如果出現訊息“此 Jenkins 實例似乎已離線。”首次啟動時出現,且容器日誌顯示諸如java.net.UnknownHostException: updates.jenkins.io
之類的行,您的容器可能在解析 DNS 名稱時遇到問題。
若要潛在地解決該問題,請啟動指定 DNS 伺服器的容器(例如 Cloudflare 的 1.1.1.1 或 Google 的 8.8.8.8,或任何其他 DNS 伺服器):
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure --dns 1.1.1.1 --dns 8.8.8.8 jenkins/jenkins:lts-jdk17
您傳遞給執行 Jenkins 映像的 docker 的參數將傳遞給 jenkins 啟動器,因此例如您可以執行:
docker run jenkins/jenkins:lts-jdk17 --version
這將顯示 Jenkins 版本,與從可執行 war 運行 Jenkins 時相同。
您也可以透過JENKINS_OPTS
定義 Jenkins 參數。這對於在衍生的 Jenkins 映像中自訂 jenkins 啟動器的參數非常有用。以下範例 Dockerfile 使用此選項強制使用 HTTPS 以及映像中包含的憑證。
FROM jenkins/jenkins:lts-jdk17 COPY --chown=jenkins:jenkins certificate.pfx /var/lib/jenkins/certificate.pfx COPY --chown=jenkins:jenkins https.key /var/lib/jenkins/pk ENV JENKINS_OPTS="--httpPort=-1 --httpsPort=8083 --httpsKeyStore=/var/lib/jenkins/certificate.pfx --httpsKeyStorePassword=Password12" EXPOSE 8083
您也可以透過在範例 Dockerfile 中定義JENKINS_SLAVE_AGENT_PORT
來變更 Jenkins 的預設代理連接埠。
FROM jenkins/jenkins:lts-jdk17 ENV JENKINS_SLAVE_AGENT_PORT=50001
或作為 docker 的參數,
docker run --name myjenkins -p 8080:8080 -p 50001:50001 --restart=on-failure --env JENKINS_SLAVE_AGENT_PORT=50001 jenkins/jenkins:lts-jdk17
注意:此環境變數將用於設定係統屬性jenkins.model.Jenkins.slaveAgentPort
。
如果已在JAVA_OPTS或JENKINS_JAVA_OPTS中設定此屬性,則
JENKINS_SLAVE_AGENT_PORT
的值將被忽略。
您可以以 root 身分執行容器 - 並透過 apt-get 安裝,透過 jenkins 工具安裝程式作為建置步驟的一部分進行安裝,或者您可以建立自己的 Dockerfile 進行自訂,例如:
FROM jenkins/jenkins:lts-jdk17 # if we want to install via apt USER root RUN apt-get update && apt-get install -y ruby make more-thing-here # drop back to the regular jenkins user - good practice USER jenkins
在這樣的衍生圖像中,您可以使用鉤子腳本或其他插件自訂 jenkins 實例。為此,請使用/usr/share/jenkins/ref
作為定義您希望目標安裝看起來像的預設 JENKINS_HOME 內容的位置:
FROM jenkins/jenkins:lts-jdk17 COPY --chown=jenkins:jenkins custom.groovy /usr/share/jenkins/ref/init.groovy.d/custom.groovy
您可以依靠外掛程式管理器 CLI 傳遞一組外掛程式及其相依性來下載。該工具將從更新中心執行下載,預設更新中心需要網路存取。
在下載過程中,CLI 將使用由下列環境變數定義的更新中心:
JENKINS_UC
- 主要更新中心。此更新中心可能會根據 Jenkins LTS Core 版本提供插件版本。預設值:https://updates.jenkins.io
JENKINS_UC_EXPERIMENTAL
- 實驗更新中心。該中心提供 Alpha 和 Beta 版本的插件。預設值:https://updates.jenkins.io/experimental
JENKINS_INCREMENTALS_REPO_MIRROR
- 定義用於從 Incrementals 儲存庫下載插件的 Maven 映像。預設值:https://repo.jenkins-ci.org/incrementals
JENKINS_UC_DOWNLOAD
- 更新中心的下載網址。預設值: $JENKINS_UC/download
JENKINS_PLUGIN_INFO
- 插件資訊的位置。預設值:https://updates.jenkins.io/current/plugin-versions.json
可以覆蓋影像中的環境變數。
❗ 請注意,更改更新中心變數不會更改 Jenkins 運行時使用的更新中心,它僅涉及插件管理器 CLI。
安裝預先建置的自訂插件可以透過將插件 HPI 檔案複製到Dockerfile
中的/usr/share/jenkins/ref/plugins/
來完成:
COPY --chown=jenkins:jenkins path/to/custom.hpi /usr/share/jenkins/ref/plugins/
您可以在 Dockerfile 中手動執行 CLI:
來自 jenkins/jenkins:lts-jdk17RUN jenkins-plugin-cli --plugins pipeline-model-definition github-branch-source:1.8
此外,可以傳遞包含這組外掛程式的檔案(有或沒有換行符)。
FROM jenkins/jenkins:lts-jdk17COPY --chown=jenkins:jenkins plugins.txt /usr/share/jenkins/ref/plugins.txtRUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt
當 jenkins 容器啟動時,它會檢查JENKINS_HOME
是否有此引用內容,並根據需要將其複製到那裡。它不會覆蓋此類文件,因此如果您從 UI 升級了某些插件,它們將不會在下次啟動時恢復。
如果您確實想要覆蓋,請將“.override”附加到參考文件的名稱中。例如,名為/usr/share/jenkins/ref/config.xml.override
的檔案將覆寫 JENKINS_HOME 中現有的config.xml
檔案。
另請參閱 JENKINS-24986
以下是從現有伺服器取得插件清單的範例:
JENKINS_HOST=username:[email protected]:port curl -sSL "http://$JENKINS_HOST/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([w-]+).*?<version>([^<]+)()(</w+>)+/1 2n/g'|sed 's/ /:/'
範例輸出:
cucumber-testresult-plugin:0.8.2 pam-auth:1.1 matrix-project:1.4.1 script-security:1.13 ...
對於 2.x 派生的圖像,您可能還需要
RUN echo 2.0 > /usr/share/jenkins/ref/jenkins.install.UpgradeWizard.state
表示此 Jenkins 安裝已完全配置。否則,將會出現一個橫幅,提示使用者安裝其他插件,這可能是不合適的。
若要從 docker 容器內的 Jenkins 主目錄啟用 Jenkins 使用者存取日誌,請將JENKINS_OPTS
環境變數值設為--accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/jenkins_home/logs/access_log
Docker Hub 上標籤的命名約定遵循格式<repository_name>:<tag>
,其中儲存庫名稱為 jenkins/jenkins ,標籤指定映像版本。對於 LTS 和最新版本,標籤分別為lts
和latest
。
您可以使用這些標籤從 Docker Hub 中提取相應的 Jenkins 映像並在您的系統上執行它們。例如,要拉取 Jenkins 映像的 LTS 版本,請使用下列指令: docker pull jenkins/jenkins:lts
若要將 Docker Compose 與 Jenkins 結合使用,您可以定義一個 docker-compose.yml 文件,其中包含 Jenkins 執行個體及其所依賴的任何其他服務。例如,以下 docker-compose.yml 檔案定義了 Jenkins 控制器和 Jenkins SSH 代理程式:
服務:詹金斯:圖像:詹金斯/詹金斯:ltsports: - “8080:8080”卷: - jenkins_home:/var/jenkins_home ssh-agent:圖像:jenkins/ssh-agentvolumes:jenkins_home:
此docker-compose.yml
檔案建立兩個容器:一個用於 Jenkins,另一個用於 Jenkins SSH 代理程式。
Jenkins 容器是基於jenkins/jenkins:lts
jenkins_home
,並在連接埠 8080 上公開 Jenkins Web 介面。
它安裝在 Jenkins 容器中的/var/jenkins_home
中,它將保留 Jenkins 配置和資料。
ssh-agent 容器基於jenkins/ssh-agent
鏡像,並執行 SSH 伺服器來執行 Jenkins SSH Build Agent。
若要啟動 Jenkins 實例和docker-compose.yml
檔案中定義的其他服務,請執行docker compose up -d
。
這將從 Docker Hub 中提取必要的映像(如果您的系統上尚不存在這些映像),並在背景啟動服務。
然後,您可以在主機系統上存取http://localhost:8080
上的 Jenkins Web 介面來設定和管理您的 Jenkins 執行個體(其中localhost
指向 Docker 引擎發布的連接埠)。
注意:如果您看到「此 Jenkins 實例似乎已離線」訊息,請閱讀DNS 設定部分。在這種情況下,將 dns 配置加入到 yaml 中:
服務:jenkins:# ...其他configdns: - 1.1.1.1 - 8.8.8.8# ...其他配置
插件安裝管理器工具支援為您更新插件檔案。
命令範例:
JENKINS_IMAGE=jenkins/jenkins:lts-jdk17 docker run -it ${JENKINS_IMAGE} bash -c "stty -onlcr && jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt --available-updates --output txt" > plugins2.txt mv 外掛程式2.txt 外掛.txt
所需的所有資料都位於 /var/jenkins_home 目錄中 - 因此取決於您如何管理 - 取決於您的升級方式。一般來說 - 你可以將其複製出來 - 然後再次“docker pull”映像 - 你將擁有最新的 LTS - 然後你可以使用 -v 指向該資料(/var/jenkins_home)啟動,一切都會如你所願下了它。
一如既往 - 請確保您知道如何驅動 docker - 尤其是捲處理!
如果將 Jenkins 主目錄掛載到 Docker 命名卷,則升級僅包含docker pull
而已。
我們建議使用docker compose
,特別是在使用者也執行並行 nginx/apache 容器作為 Jenkins 容器的反向代理的情況下。
預設情況下,如果外掛程式尚未手動升級且 docker 映像中的版本比容器中的版本新,則插件將被升級。 docker 映像安裝的版本透過標記檔案進行追蹤。
若要強制升級已手動升級的插件,請使用-e PLUGINS_FORCE_UPGRADE=true
執行 docker 映像。
從未寫入標記檔案的 docker 映像升級時的預設行為是保留現有插件。如果您想在沒有標記的情況下升級現有插件,您可以使用-e TRY_UPGRADE_IF_NO_MARKER=true
執行 docker 映像。如果docker映像提供的版本較新,外掛程式將會升級。
如果您希望為此儲存庫提供修復,請參閱專用文件。
有關此 Docker 映像安全性的信息,請參閱專用文件。
我們在 Gitter,https://gitter.im/jenkinsci/docker