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"]