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
映像,并在端口 8080 上公开 Jenkins Web 界面。 jenkins_home
卷是由 Docker 创建和管理的命名卷。
它安装在 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