jenkins 服务器在harbor拉取docker.io/tomcat:9.0.67-jdk8镜像到本地使用dockerfile以docker.io/tomcat:9.0.67-jdk8镜像为基础在/usr/local/tomcat/webapps/下添加war包构建新的镜像 并上传到harbor上
时间: 2025-07-30 17:28:45 浏览: 13
<think>我们正在使用Jenkins来自动化构建一个基于Tomcat镜像的Docker镜像,并将WAR包添加到其中,然后推送到Harbor私有仓库。根据引用内容,我们可以总结以下步骤:1.Jenkins服务器需要配置Docker,并且能够访问Harbor仓库(包括登录认证)。2.Jenkins服务器上的Jenkins用户需要有执行Docker命令的权限(将jenkins用户加入docker组)。3.在Jenkins任务中,我们将编写一个Dockerfile,以docker.io/tomcat:9.0.67-jdk8为基础镜像,将WAR包复制到webapps目录下。4.使用dockerbuild构建镜像,并使用dockerpush推送到Harbor。具体步骤:步骤1:确保Jenkins服务器上的Docker配置了Harbor为不安全仓库(如果Harbor使用HTTP)或配置HTTPS(这里引用中使用了HTTP,所以配置为不安全仓库)。修改/etc/docker/daemon.json,添加"insecure-registries":["192.168.10.23"],然后重启docker(如引用[3]所示)。步骤2:确保Jenkins用户属于docker组(如引用[4]所示),这样Jenkins就可以执行docker命令。步骤3:在Jenkins任务中,我们需要添加构建步骤来执行Docker构建和推送。假设我们的项目已经通过Jenkins从代码仓库拉取,并且通过Maven构建生成了WAR包(位于target目录下)。步骤4:编写Dockerfile,内容如下:```FROMdocker.io/tomcat:9.0.67-jdk8#删除默认的ROOT应用(可选,如果需要用自己的应用作为根路径,则可以将WAR包命名为ROOT.war)RUNrm-rf/usr/local/tomcat/webapps/ROOT#复制WAR包到webapps目录,这里假设WAR包名为app.war,如果你希望它是根应用,则命名为ROOT.warCOPYtarget/*.war/usr/local/tomcat/webapps/ROOT.war#注意:如果项目有多个WAR包,需要具体指定一个,这里使用通配符*,如果只有一个WAR包则没问题```步骤5:在Jenkins构建步骤中执行dockerbuild和dockerpush。假设Harbor仓库地址为192.168.10.23,项目名称为library,镜像名称为solo,标签为${Tag}(可以在Jenkins中定义变量)。具体命令:```dockerbuild-t192.168.10.23/library/solo:${Tag}.dockerlogin192.168.10.23-uadmin-pHarbor12345dockerpush192.168.10.23/library/solo:${Tag}dockerlogout192.168.10.23```注意:这里使用了硬编码的密码,实际中应该使用Jenkins的凭证管理来存储Harbor的密码。步骤6:在Jenkins中配置Tag,例如可以使用构建编号作为Tag:${BUILD_NUMBER}。因此,Jenkins任务中的执行shell步骤可以这样写:```bash#假设当前目录是项目的工作目录,并且已经通过构建步骤生成了target/*.warTag=${BUILD_NUMBER}REPOSITORY="192.168.10.23/library/solo:$Tag"cat>Dockerfile<<EOFFROMdocker.io/tomcat:9.0.67-jdk8RUNrm-rf/usr/local/tomcat/webapps/ROOTCOPYtarget/*.war/usr/local/tomcat/webapps/ROOT.warEOFdockerbuild-t$REPOSITORY.dockerlogin192.168.10.23-uadmin-pHarbor12345dockerpush$REPOSITORYdockerlogout192.168.10.23```但是,请注意,在实际生产环境中,密码不应该明文写在脚本中。我们应该使用Jenkins的凭证功能来安全地存储密码。改进:使用Jenkins凭证管理Harbor登录密码1.在Jenkins中添加一个用户名密码类型的凭证,例如凭证ID为'harbor-cred',用户名为admin,密码为Harbor12345。2.在Jenkins任务中,使用withCredentials来获取凭证。修改后的脚本:```bashTag=${BUILD_NUMBER}REPOSITORY="192.168.10.23/library/solo:$Tag"cat>Dockerfile<<EOFFROMdocker.io/tomcat:9.0.67-jdk8RUNrm-rf/usr/local/tomcat/webapps/ROOTCOPYtarget/*.war/usr/local/tomcat/webapps/ROOT.warEOFdockerbuild-t$REPOSITORY.#使用凭证dockerlogin192.168.10.23-uadmin-p${HARBOR_PASSWORD}dockerpush$REPOSITORYdockerlogout192.168.10.23```然后在Jenkins的构建步骤中,使用withCredentials绑定凭证:在Pipeline脚本中,可以这样写:```stage('BuildandPushDockerImage'){withCredentials([usernamePassword(credentialsId:'harbor-cred',usernameVariable:'USERNAME',passwordVariable:'PASSWORD')]){sh"""Tag=${BUILD_NUMBER}REPOSITORY="192.168.10.23/library/solo:\$Tag"dockerbuild-t\$REPOSITORY.dockerlogin192.168.10.23-u\$USERNAME-p\$PASSWORDdockerpush\$REPOSITORYdockerlogout192.168.10.23"""}}```如果是自由风格项目,可以使用“Injectpasswordstothebuildasenvironmentvariables”选项,或者使用“CredentialsBinding”插件,在构建环境中绑定凭证,然后在脚本中使用环境变量。自由风格项目配置:1.在构建环境中勾选“Usesecrettext(s)orfile(s)”,然后添加一个绑定:选择用户名和密码,指定变量名(例如USERNAME和PASSWORD),并选择对应的凭证。2.在构建步骤的Executeshell中:```bashTag=${BUILD_NUMBER}REPOSITORY="192.168.10.23/library/solo:$Tag"dockerbuild-t$REPOSITORY.dockerlogin192.168.10.23-u$USERNAME-p$PASSWORDdockerpush$REPOSITORYdockerlogout192.168.10.23```注意:在自由风格项目中,环境变量可以直接使用。总结:通过以上步骤,Jenkins就可以从Harbor拉取Tomcat镜像(实际上在构建时Docker会从远程拉取,如果本地没有的话),然后添加WAR包构建新镜像,并推送到Harbor仓库。注意:在构建镜像之前,需要确保Dockerfile中的COPY命令能够找到WAR包,因此需要先通过构建步骤(如Maven)生成WAR包。如果项目不是Maven项目,则需要根据实际情况生成WAR包。另外,如果Harbor仓库中的项目library不存在,需要先在Harbor中创建这个项目,因为Harbor对于项目是权限控制的,并且推送镜像到项目需要先存在该项目。以上就是完整的配置过程。</think>### Jenkins配置Dockerfile构建Tomcat镜像并推送至Harbor
#### 步骤1:配置Jenkins环境
```bash
# 1.1 添加Jenkins用户到docker组
sudo usermod -aG docker jenkins
sudo systemctl restart jenkins
# 1.2 配置Docker信任Harbor仓库
sudo tee /etc/docker/daemon.json <<EOF
{
"insecure-registries": ["http://192.168.10.23"]
}
EOF
sudo systemctl restart docker
```
#### 步骤2:创建Dockerfile
在Jenkins项目根目录创建`Dockerfile`:
```dockerfile
# 使用官方Tomcat镜像
FROM docker.io/tomcat:9.0.67-jdk8
# 删除默认应用
RUN rm -rf /usr/local/tomcat/webapps/ROOT
# 添加WAR包到webapps目录
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war
# 暴露端口
EXPOSE 8080
# 启动Tomcat
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]
```
#### 步骤3:Jenkins构建脚本
在Jenkins的`Execute Shell`构建步骤中添加:
```bash
#!/bin/bash
# 设置镜像标签
Tag=${BUILD_NUMBER}
REPOSITORY="192.168.10.23/library/solo:${Tag}"
# 构建镜像
docker build -t $REPOSITORY .
# 登录Harbor
docker login 192.168.10.23 -u admin -p Harbor12345
# 推送镜像
docker push $REPOSITORY
# 清理
docker logout 192.168.10.23
```
#### 步骤4:配置Jenkins凭证(推荐)
1. 在Jenkins中添加Harbor凭证:
- **类型**:Username with password
- **ID**:harbor-creds
- **用户名**:admin
- **密码**:Harbor12345
2. 修改构建脚本使用凭证:
```bash
#!/bin/bash
Tag=${BUILD_NUMBER}
REPOSITORY="192.168.10.23/library/solo:${Tag}"
docker build -t $REPOSITORY .
# 使用凭证登录
docker login 192.168.10.23 -u $(cat /path/to/username) -p $(cat /path/to/password)
docker push $REPOSITORY
docker logout 192.168.10.23
```
#### 验证流程
```mermaid
graph TD
A[Jenkins拉取代码] --> B[Maven构建WAR包]
B --> C[执行Dockerfile构建]
C --> D[登录Harbor仓库]
D --> E[推送新镜像]
E --> F[清理登出]
```
#### 关键配置说明
1. **WAR包处理**:
- `COPY target/*.war` 将编译后的WAR包复制到容器
- 重命名为`ROOT.war`使其成为默认应用
2. **镜像命名规范**:
- `192.168.10.23/library/solo:${Tag}`
- `192.168.10.23`:Harbor地址
- `library`:项目名称
- `solo`:镜像名称
- `${Tag}`:使用Jenkins构建编号
3. **安全建议**:
- 使用Jenkins凭证管理密码[^3]
- 为不同环境设置独立Harbor项目
- 配置镜像扫描策略
#### 常见问题解决
- **权限拒绝**:确认Jenkins用户属于docker组[^4]
- **无法连接Harbor**:检查`insecure-registries`配置[^3]
- **WAR包未找到**:确保Maven构建在Docker构建之前执行
- **推送失败**:验证Harbor项目是否存在且用户有推送权限[^1]
---
阅读全文
相关推荐




















