Jenkins pipeline 部署docker通用模板
Jenkinsfile:
Docker的NETWORK_NAME不要使用bridge默认网络,要使用自定义的网络如test
- 默认 bridge 网络:容器间不能用名字互相访问,只能用 IP。
- 自定义网络:容器间可以用名字互相访问,Docker 自动做了 DNS 解析。
pipeline {agent anyenvironment {// 定义镜像名称和标签作为环境变量IMAGE_NAME = 'my-application' IMAGE_TAG = 'latest'CONTAINER_NAME = 'my-app-container'VOLUME_NAME = 'app-data-volume'NETWORK_NAME = 'test' // 使用自定义网络名称HOST_PORT = '8080'CONTAINER_PORT = '8080'}stages {stage('检查运行中的容器') {steps {script {// 检查容器是否存在并移除try {sh "docker container inspect ${CONTAINER_NAME}"echo "容器 ${CONTAINER_NAME} 已存在。正在停止并移除..."sh "docker container stop ${CONTAINER_NAME}"sh "docker container rm ${CONTAINER_NAME}"} catch (Exception e) {echo "未找到名为 ${CONTAINER_NAME} 的容器。"}// 检查镜像是否存在并移除try {sh "docker image inspect ${IMAGE_NAME}:${IMAGE_TAG}"echo "镜像 ${IMAGE_NAME}:${IMAGE_TAG} 已存在。正在移除..."sh "docker rmi ${IMAGE_NAME}:${IMAGE_TAG} -f"} catch (Exception e) {echo "未找到镜像 ${IMAGE_NAME}:${IMAGE_TAG}。"}}}}stage('创建 Docker 卷') {steps {script {// 检查卷是否存在,不存在则创建try {sh "docker volume inspect ${VOLUME_NAME}"echo "卷 ${VOLUME_NAME} 已存在。"} catch (Exception e) {echo "正在创建卷 ${VOLUME_NAME}..."sh "docker volume create ${VOLUME_NAME}"}}}}stage('构建 Docker 镜像') {steps {script {// 构建 Docker 镜像echo "正在构建 Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG}..."sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."}}}stage('运行 Docker 容器') {steps {script {// 运行 Docker 容器,挂载卷并映射端口echo "正在启动容器 ${CONTAINER_NAME}..."sh """docker run -d \--name ${CONTAINER_NAME} \-p ${HOST_PORT}:${CONTAINER_PORT} \-v ${VOLUME_NAME}:/app/data \--network ${NETWORK_NAME} \${IMAGE_NAME}:${IMAGE_TAG}"""}}}stage('清理') {steps {script {// 移除未使用的镜像echo "正在清理未使用的 Docker 镜像..."sh "docker image prune -f"}}}}post {success {echo "部署成功!"echo "应用程序可通过 http://<服务器IP>:${HOST_PORT} 访问"}failure {echo "部署失败!"}always {echo "流水线执行完成。"}}
}
Dockerfile:
# 使用官方 Python 基础镜像(轻量级版本)
FROM python:3.10-slim# 设置工作目录
WORKDIR /app# 先复制依赖文件,以便利用 Docker 缓存层
COPY requirements.txt .# 设置 pip 使用国内镜像源加速下载(可根据需要修改或删除)
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple# 安装依赖(使用 --no-cache-dir 减少镜像大小)
RUN pip install --no-cache-dir -r requirements.txt# 复制项目所有文件(放在依赖安装之后,以便代码变更不影响依赖层缓存)
COPY . .# 暴露应用端口(根据实际应用修改)
EXPOSE 8080# 设置容器启动命令(根据实际应用修改)
CMD ["python", "app.py"]