最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python項(xiàng)目Docker倉(cāng)庫(kù)發(fā)布指南

 更新時(shí)間:2025年08月31日 11:29:23   作者:lookFlying  
本文檔詳細(xì)介紹如何將 AI Backend Python 項(xiàng)目構(gòu)建為 Docker 鏡像并發(fā)布到各種 Docker 倉(cāng)庫(kù),包括 Docker Hub、阿里云容器鏡像服務(wù)、騰訊云容器鏡像服務(wù)等,需要的朋友可以參考下

概述

本文檔詳細(xì)介紹如何將 AI Backend Python 項(xiàng)目構(gòu)建為 Docker 鏡像并發(fā)布到各種 Docker 倉(cāng)庫(kù),包括 Docker Hub、阿里云容器鏡像服務(wù)、騰訊云容器鏡像服務(wù)等。

1. 準(zhǔn)備工作

1.1 環(huán)境要求

  • Docker Desktop: 最新版本
  • Git: 用于版本控制
  • PowerShell: Windows 環(huán)境下的命令行工具
  • 網(wǎng)絡(luò)連接: 能夠訪問(wèn) Docker 倉(cāng)庫(kù)

1.2 項(xiàng)目文件檢查

確保項(xiàng)目包含以下 Docker 相關(guān)文件:

ai_backend_python/
├── Dockerfile              # 生產(chǎn)環(huán)境鏡像
├── Dockerfile.dev          # 開(kāi)發(fā)環(huán)境鏡像
├── docker-compose.yml      # 服務(wù)編排文件
├── docker-compose.dev.yml  # 開(kāi)發(fā)環(huán)境編排
├── .dockerignore           # Docker 忽略文件
├── requirements.txt        # Python 依賴
└── .env.example           # 環(huán)境變量模板

1.3 創(chuàng)建 .dockerignore 文件

如果不存在,創(chuàng)建 .dockerignore 文件:

# .dockerignore
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
pip-log.txt
pip-delete-this-directory.txt
.tox
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.log
.git
.mypy_cache
.pytest_cache
.hypothesis

# 開(kāi)發(fā)文件
.vscode
.idea
*.swp
*.swo
*~

# 環(huán)境文件
.env
.env.local
.env.*.local

# 數(shù)據(jù)庫(kù)文件
*.db
*.sqlite
*.sqlite3

# 日志文件
logs/
*.log

# 上傳文件
uploads/

# 文檔
docs/
README.md

# 測(cè)試文件
tests/

# 構(gòu)建產(chǎn)物
build/
dist/

2. 本地構(gòu)建和測(cè)試

2.1 構(gòu)建生產(chǎn)鏡像

# 進(jìn)入項(xiàng)目目錄
cd e:\project\ai-mini\ai_backend_python

# 構(gòu)建生產(chǎn)鏡像
docker build -t ai-mini-backend:latest .

# 構(gòu)建帶版本標(biāo)簽的鏡像
docker build -t ai-mini-backend:v1.0.0 .

# 查看構(gòu)建的鏡像
docker images | Select-String "ai-mini-backend"

2.2 構(gòu)建開(kāi)發(fā)鏡像

# 構(gòu)建開(kāi)發(fā)鏡像
docker build -f Dockerfile.dev -t ai-mini-backend:dev .

2.3 本地測(cè)試鏡像

# 創(chuàng)建測(cè)試環(huán)境變量文件
Copy-Item .env.example .env.test

# 編輯 .env.test 文件,設(shè)置測(cè)試配置
# notepad .env.test

# 運(yùn)行容器進(jìn)行測(cè)試
docker run -d `
  --name test-backend `
  -p 8000:8000 `
  --env-file .env.test `
  -v "${PWD}\uploads:/app/uploads" `
  ai-mini-backend:latest

# 等待容器啟動(dòng)
Start-Sleep -Seconds 10

# 檢查容器狀態(tài)
docker ps

# 查看容器日志
docker logs test-backend

# 測(cè)試健康檢查端點(diǎn)
Invoke-WebRequest -Uri "http://localhost:8000/health" -Method GET

# 測(cè)試 API 端點(diǎn)
Invoke-WebRequest -Uri "http://localhost:8000/api/v1/health" -Method GET

# 停止并刪除測(cè)試容器
docker stop test-backend
docker rm test-backend

2.4 使用 Docker Compose 測(cè)試

# 使用 docker-compose 啟動(dòng)完整服務(wù)
docker-compose up -d

# 查看服務(wù)狀態(tài)
docker-compose ps

# 查看日志
docker-compose logs -f ai-backend

# 停止服務(wù)
docker-compose down

3. 發(fā)布到 Docker Hub

3.1 注冊(cè) Docker Hub 賬號(hào)

  1. 訪問(wèn) Docker Hub
  2. 注冊(cè)賬號(hào)或登錄現(xiàn)有賬號(hào)
  3. 創(chuàng)建新的倉(cāng)庫(kù)(Repository)

3.2 登錄 Docker Hub

# 登錄 Docker Hub
docker login
# 輸入用戶名和密碼

3.3 標(biāo)記鏡像

# 替換 yourusername 為您的 Docker Hub 用戶名
$dockerUsername = "yourusername"
$imageName = "ai-mini-backend"
$version = "v1.0.0"

# 標(biāo)記鏡像
docker tag ai-mini-backend:latest "${dockerUsername}/${imageName}:latest"
docker tag ai-mini-backend:latest "${dockerUsername}/${imageName}:${version}"

# 查看標(biāo)記的鏡像
docker images | Select-String $imageName

3.4 推送鏡像

# 推送最新版本
docker push "${dockerUsername}/${imageName}:latest"

# 推送特定版本
docker push "${dockerUsername}/${imageName}:${version}"

# 驗(yàn)證推送結(jié)果
Write-Host "鏡像已成功推送到 Docker Hub" -ForegroundColor Green
Write-Host "鏡像地址: ${dockerUsername}/${imageName}:${version}" -ForegroundColor Cyan

4. 發(fā)布到私有倉(cāng)庫(kù)

4.1 阿里云容器鏡像服務(wù)

4.1.1 準(zhǔn)備工作

  1. 登錄 阿里云控制臺(tái)
  2. 開(kāi)通容器鏡像服務(wù)
  3. 創(chuàng)建命名空間和鏡像倉(cāng)庫(kù)
  4. 獲取訪問(wèn)憑證

4.1.2 登錄和推送

# 設(shè)置阿里云鏡像倉(cāng)庫(kù)信息
$aliRegistry = "registry.cn-hangzhou.aliyuncs.com"
$aliNamespace = "your-namespace"
$aliUsername = "your-username"

# 登錄阿里云鏡像倉(cāng)庫(kù)
docker login --username=$aliUsername $aliRegistry

# 標(biāo)記鏡像
docker tag ai-mini-backend:latest "${aliRegistry}/${aliNamespace}/ai-mini-backend:latest"
docker tag ai-mini-backend:latest "${aliRegistry}/${aliNamespace}/ai-mini-backend:${version}"

# 推送鏡像
docker push "${aliRegistry}/${aliNamespace}/ai-mini-backend:latest"
docker push "${aliRegistry}/${aliNamespace}/ai-mini-backend:${version}"

4.2 騰訊云容器鏡像服務(wù)

4.2.1 準(zhǔn)備工作

  1. 登錄 騰訊云控制臺(tái)
  2. 開(kāi)通容器鏡像服務(wù)
  3. 創(chuàng)建命名空間和鏡像倉(cāng)庫(kù)
  4. 獲取訪問(wèn)憑證

4.2.2 登錄和推送

# 設(shè)置騰訊云鏡像倉(cāng)庫(kù)信息
$tencentRegistry = "ccr.ccs.tencentyun.com"
$tencentNamespace = "your-namespace"
$tencentUsername = "your-username"

# 登錄騰訊云鏡像倉(cāng)庫(kù)
docker login --username=$tencentUsername $tencentRegistry

# 標(biāo)記鏡像
docker tag ai-mini-backend:latest "${tencentRegistry}/${tencentNamespace}/ai-mini-backend:latest"
docker tag ai-mini-backend:latest "${tencentRegistry}/${tencentNamespace}/ai-mini-backend:${version}"

# 推送鏡像
docker push "${tencentRegistry}/${tencentNamespace}/ai-mini-backend:latest"
docker push "${tencentRegistry}/${tencentNamespace}/ai-mini-backend:${version}"

4.3 私有 Docker Registry

# 設(shè)置私有倉(cāng)庫(kù)信息
$privateRegistry = "your-private-registry.com:5000"

# 登錄私有倉(cāng)庫(kù)(如果需要認(rèn)證)
docker login $privateRegistry

# 標(biāo)記鏡像
docker tag ai-mini-backend:latest "${privateRegistry}/ai-mini-backend:latest"
docker tag ai-mini-backend:latest "${privateRegistry}/ai-mini-backend:${version}"

# 推送鏡像
docker push "${privateRegistry}/ai-mini-backend:latest"
docker push "${privateRegistry}/ai-mini-backend:${version}"

5. 自動(dòng)化發(fā)布

5.1 PowerShell 發(fā)布腳本

創(chuàng)建 scripts/docker-publish.ps1

<#
.SYNOPSIS
    AI Mini Backend Docker 鏡像發(fā)布腳本

.DESCRIPTION
    自動(dòng)構(gòu)建、標(biāo)記和推送 Docker 鏡像到指定倉(cāng)庫(kù)

.PARAMETER Version
    鏡像版本號(hào),例如 "v1.0.0"

.PARAMETER Registry
    Docker 倉(cāng)庫(kù)地址,默認(rèn)為 "docker.io"

.PARAMETER Username
    Docker 倉(cāng)庫(kù)用戶名

.PARAMETER Namespace
    命名空間(用于阿里云、騰訊云等)

.PARAMETER ImageName
    鏡像名稱,默認(rèn)為 "ai-mini-backend"

.PARAMETER PushLatest
    是否推送 latest 標(biāo)簽,默認(rèn)為 true

.EXAMPLE
    .\scripts\docker-publish.ps1 -Version "v1.0.0" -Username "myusername"

.EXAMPLE
    .\scripts\docker-publish.ps1 -Version "v1.0.0" -Registry "registry.cn-hangzhou.aliyuncs.com" -Username "myusername" -Namespace "mynamespace"
#>

param(
    [Parameter(Mandatory=$true)]
    [string]$Version,
  
    [Parameter(Mandatory=$false)]
    [string]$Registry = "docker.io",
  
    [Parameter(Mandatory=$true)]
    [string]$Username,
  
    [Parameter(Mandatory=$false)]
    [string]$Namespace = "",
  
    [Parameter(Mandatory=$false)]
    [string]$ImageName = "ai-mini-backend",
  
    [Parameter(Mandatory=$false)]
    [bool]$PushLatest = $true,
  
    [Parameter(Mandatory=$false)]
    [bool]$BuildImage = $true,
  
    [Parameter(Mandatory=$false)]
    [string]$Dockerfile = "Dockerfile"
)

# 設(shè)置錯(cuò)誤處理
$ErrorActionPreference = "Stop"

# 函數(shù):寫入彩色日志
function Write-ColorLog {
    param(
        [string]$Message,
        [string]$Color = "White"
    )
    Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $Message" -ForegroundColor $Color
}

# 函數(shù):檢查命令是否存在
function Test-Command {
    param([string]$Command)
    try {
        Get-Command $Command -ErrorAction Stop
        return $true
    } catch {
        return $false
    }
}

# 檢查 Docker 是否安裝
if (-not (Test-Command "docker")) {
    Write-ColorLog "錯(cuò)誤: Docker 未安裝或不在 PATH 中" "Red"
    exit 1
}

# 檢查 Docker 是否運(yùn)行
try {
    docker version | Out-Null
} catch {
    Write-ColorLog "錯(cuò)誤: Docker 服務(wù)未運(yùn)行" "Red"
    exit 1
}

Write-ColorLog "開(kāi)始發(fā)布 AI Mini Backend Docker 鏡像..." "Green"
Write-ColorLog "版本: $Version" "Cyan"
Write-ColorLog "倉(cāng)庫(kù): $Registry" "Cyan"
Write-ColorLog "用戶名: $Username" "Cyan"

# 構(gòu)建完整的鏡像名稱
if ($Namespace) {
    $fullImageName = "$Registry/$Namespace/$ImageName"
} else {
    if ($Registry -eq "docker.io") {
        $fullImageName = "$Username/$ImageName"
    } else {
        $fullImageName = "$Registry/$Username/$ImageName"
    }
}

Write-ColorLog "完整鏡像名稱: $fullImageName" "Cyan"

# 構(gòu)建鏡像
if ($BuildImage) {
    Write-ColorLog "開(kāi)始構(gòu)建鏡像..." "Yellow"
  
    try {
        docker build -f $Dockerfile -t "${ImageName}:${Version}" .
        if ($LASTEXITCODE -ne 0) {
            throw "Docker build failed"
        }
        Write-ColorLog "鏡像構(gòu)建成功" "Green"
    } catch {
        Write-ColorLog "鏡像構(gòu)建失敗: $_" "Red"
        exit 1
    }
}

# 標(biāo)記鏡像
Write-ColorLog "開(kāi)始標(biāo)記鏡像..." "Yellow"

try {
    # 標(biāo)記版本鏡像
    docker tag "${ImageName}:${Version}" "${fullImageName}:${Version}"
    if ($LASTEXITCODE -ne 0) {
        throw "Failed to tag version image"
    }
  
    # 標(biāo)記 latest 鏡像
    if ($PushLatest) {
        docker tag "${ImageName}:${Version}" "${fullImageName}:latest"
        if ($LASTEXITCODE -ne 0) {
            throw "Failed to tag latest image"
        }
    }
  
    Write-ColorLog "鏡像標(biāo)記完成" "Green"
} catch {
    Write-ColorLog "鏡像標(biāo)記失敗: $_" "Red"
    exit 1
}

# 登錄 Docker 倉(cāng)庫(kù)
Write-ColorLog "登錄 Docker 倉(cāng)庫(kù)..." "Yellow"

try {
    if ($Registry -ne "docker.io") {
        docker login $Registry
    } else {
        docker login
    }
  
    if ($LASTEXITCODE -ne 0) {
        throw "Docker login failed"
    }
  
    Write-ColorLog "登錄成功" "Green"
} catch {
    Write-ColorLog "登錄失敗: $_" "Red"
    exit 1
}

# 推送鏡像
Write-ColorLog "開(kāi)始推送鏡像..." "Yellow"

try {
    # 推送版本鏡像
    Write-ColorLog "推送版本鏡像: ${fullImageName}:${Version}" "Cyan"
    docker push "${fullImageName}:${Version}"
    if ($LASTEXITCODE -ne 0) {
        throw "Failed to push version image"
    }
  
    # 推送 latest 鏡像
    if ($PushLatest) {
        Write-ColorLog "推送 latest 鏡像: ${fullImageName}:latest" "Cyan"
        docker push "${fullImageName}:latest"
        if ($LASTEXITCODE -ne 0) {
            throw "Failed to push latest image"
        }
    }
  
    Write-ColorLog "鏡像推送成功!" "Green"
    Write-ColorLog "鏡像地址:" "White"
    Write-ColorLog "  - ${fullImageName}:${Version}" "Cyan"
    if ($PushLatest) {
        Write-ColorLog "  - ${fullImageName}:latest" "Cyan"
    }
  
} catch {
    Write-ColorLog "鏡像推送失敗: $_" "Red"
    exit 1
}

# 清理本地鏡像(可選)
$cleanup = Read-Host "是否清理本地構(gòu)建的鏡像? (y/N)"
if ($cleanup -eq "y" -or $cleanup -eq "Y") {
    Write-ColorLog "清理本地鏡像..." "Yellow"
  
    try {
        docker rmi "${ImageName}:${Version}" -f
        docker rmi "${fullImageName}:${Version}" -f
        if ($PushLatest) {
            docker rmi "${fullImageName}:latest" -f
        }
        Write-ColorLog "本地鏡像清理完成" "Green"
    } catch {
        Write-ColorLog "清理本地鏡像時(shí)出現(xiàn)警告: $_" "Yellow"
    }
}

Write-ColorLog "Docker 鏡像發(fā)布完成!" "Green"

5.2 使用發(fā)布腳本

# 設(shè)置執(zhí)行策略(首次使用時(shí))
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# 發(fā)布到 Docker Hub
.\scripts\docker-publish.ps1 -Version "v1.0.0" -Username "yourusername"

# 發(fā)布到阿里云
.\scripts\docker-publish.ps1 `
    -Version "v1.0.0" `
    -Registry "registry.cn-hangzhou.aliyuncs.com" `
    -Username "your-aliyun-username" `
    -Namespace "your-namespace"

# 發(fā)布到騰訊云
.\scripts\docker-publish.ps1 `
    -Version "v1.0.0" `
    -Registry "ccr.ccs.tencentyun.com" `
    -Username "your-tencent-username" `
    -Namespace "your-namespace"

# 只推送,不重新構(gòu)建
.\scripts\docker-publish.ps1 `
    -Version "v1.0.0" `
    -Username "yourusername" `
    -BuildImage $false

5.3 GitHub Actions 自動(dòng)發(fā)布

創(chuàng)建 .github/workflows/docker-publish.yml

name: Build and Push Docker Image

on:
  push:
    tags:
      - 'v*'
  release:
    types: [published]
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to build and push'
        required: true
        default: 'latest'

env:
  REGISTRY: docker.io
  IMAGE_NAME: ai-mini-backend

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v3

    - name: Log in to Docker Hub
      uses: docker/login-action@v3
      with:
        registry: ${{ env.REGISTRY }}
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Extract metadata
      id: meta
      uses: docker/metadata-action@v5
      with:
        images: ${{ env.REGISTRY }}/${{ secrets.DOCKER_USERNAME }}/${{ env.IMAGE_NAME }}
        tags: |
          type=ref,event=tag
          type=raw,value=latest,enable={{is_default_branch}}
          type=raw,value=${{ github.event.inputs.version }},enable=${{ github.event_name == 'workflow_dispatch' }}

    - name: Build and push Docker image
      uses: docker/build-push-action@v5
      with:
        context: ./ai_backend_python
        file: ./ai_backend_python/Dockerfile
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        cache-from: type=gha
        cache-to: type=gha,mode=max
        platforms: linux/amd64,linux/arm64

    - name: Update deployment
      if: github.ref == 'refs/heads/main'
      run: |
        echo "Deployment updated with new image: ${{ steps.meta.outputs.tags }}"
        # 這里可以添加自動(dòng)部署邏輯

5.4 配置 GitHub Secrets

在 GitHub 倉(cāng)庫(kù)設(shè)置中添加以下 Secrets:

  • DOCKER_USERNAME: Docker Hub 用戶名
  • DOCKER_PASSWORD: Docker Hub 密碼或訪問(wèn)令牌

6. 鏡像優(yōu)化

6.1 多階段構(gòu)建優(yōu)化

創(chuàng)建優(yōu)化的 Dockerfile.optimized

# AI Mini Backend Python - 優(yōu)化的多階段構(gòu)建

# 構(gòu)建階段
FROM python:3.11-slim as builder

# 設(shè)置工作目錄
WORKDIR /app

# 安裝構(gòu)建依賴
RUN apt-get update && apt-get install -y \
    gcc \
    default-libmysqlclient-dev \
    pkg-config \
    && rm -rf /var/lib/apt/lists/*

# 復(fù)制并安裝 Python 依賴
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt

# 運(yùn)行時(shí)階段
FROM python:3.11-slim as runtime

# 設(shè)置工作目錄
WORKDIR /app

# 安裝運(yùn)行時(shí)依賴
RUN apt-get update && apt-get install -y \
    default-libmysqlclient-dev \
    curl \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# 從構(gòu)建階段復(fù)制已安裝的依賴
COPY --from=builder /root/.local /root/.local

# 復(fù)制應(yīng)用代碼
COPY src/ ./src/
COPY scripts/ ./scripts/
COPY .env.example .

# 創(chuàng)建必要目錄
RUN mkdir -p uploads logs

# 創(chuàng)建非 root 用戶
RUN useradd --create-home --shell /bin/bash app && \
    chown -R app:app /app
USER app

# 設(shè)置環(huán)境變量
ENV PATH=/root/.local/bin:$PATH
ENV PYTHONPATH=/app
ENV PYTHONUNBUFFERED=1
ENV ENVIRONMENT=production

# 暴露端口
EXPOSE 8000

# 健康檢查
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8000/health || exit 1

# 啟動(dòng)命令
CMD ["python", "scripts/start.py", "--env", "prod"]

6.2 鏡像大小優(yōu)化

# 構(gòu)建優(yōu)化鏡像
docker build -f Dockerfile.optimized -t ai-mini-backend:optimized .

# 比較鏡像大小
docker images | Select-String "ai-mini-backend"

# 分析鏡像層
docker history ai-mini-backend:optimized

6.3 安全掃描

# 使用 Docker Scout 掃描安全漏洞
docker scout cves ai-mini-backend:latest

# 使用 Trivy 掃描(需要先安裝 Trivy)
# docker run --rm -v /var/run/docker.sock:/var/run/docker.sock `
#   aquasec/trivy image ai-mini-backend:latest

7. 版本管理

7.1 語(yǔ)義化版本控制

采用 語(yǔ)義化版本 規(guī)范:

  • v1.0.0 - 主要版本(不兼容的 API 修改)
  • v1.1.0 - 次要版本(向下兼容的功能性新增)
  • v1.1.1 - 修訂版本(向下兼容的問(wèn)題修正)

7.2 標(biāo)簽策略

# 發(fā)布穩(wěn)定版本
$version = "v1.0.0"
docker tag ai-mini-backend:latest "yourusername/ai-mini-backend:$version"
docker tag ai-mini-backend:latest "yourusername/ai-mini-backend:latest"
docker tag ai-mini-backend:latest "yourusername/ai-mini-backend:stable"

# 發(fā)布預(yù)發(fā)布版本
$preVersion = "v1.1.0-beta.1"
docker tag ai-mini-backend:latest "yourusername/ai-mini-backend:$preVersion"
docker tag ai-mini-backend:latest "yourusername/ai-mini-backend:beta"

# 發(fā)布開(kāi)發(fā)版本
docker tag ai-mini-backend:dev "yourusername/ai-mini-backend:dev"
docker tag ai-mini-backend:dev "yourusername/ai-mini-backend:nightly"

7.3 版本發(fā)布腳本

創(chuàng)建 scripts/release.ps1

<#
.SYNOPSIS
    版本發(fā)布腳本

.DESCRIPTION
    自動(dòng)化版本發(fā)布流程,包括版本標(biāo)記、構(gòu)建、推送等

.PARAMETER Version
    發(fā)布版本號(hào)

.PARAMETER Type
    發(fā)布類型:major, minor, patch, prerelease
#>

param(
    [Parameter(Mandatory=$false)]
    [string]$Version,
  
    [Parameter(Mandatory=$false)]
    [ValidateSet("major", "minor", "patch", "prerelease")]
    [string]$Type = "patch",
  
    [Parameter(Mandatory=$true)]
    [string]$Username
)

# 函數(shù):獲取當(dāng)前版本
function Get-CurrentVersion {
    try {
        $tags = git tag --sort=-version:refname
        if ($tags) {
            return $tags[0]
        } else {
            return "v0.0.0"
        }
    } catch {
        return "v0.0.0"
    }
}

# 函數(shù):計(jì)算下一個(gè)版本
function Get-NextVersion {
    param(
        [string]$CurrentVersion,
        [string]$Type
    )
  
    # 移除 'v' 前綴
    $version = $CurrentVersion -replace '^v', ''
    $parts = $version -split '\.' | ForEach-Object { [int]$_ }
  
    switch ($Type) {
        "major" { 
            $parts[0]++
            $parts[1] = 0
            $parts[2] = 0
        }
        "minor" { 
            $parts[1]++
            $parts[2] = 0
        }
        "patch" { 
            $parts[2]++
        }
        "prerelease" {
            $parts[2]++
            return "v$($parts[0]).$($parts[1]).$($parts[2])-beta.1"
        }
    }
  
    return "v$($parts[0]).$($parts[1]).$($parts[2])"
}

# 獲取版本信息
if (-not $Version) {
    $currentVersion = Get-CurrentVersion
    $Version = Get-NextVersion -CurrentVersion $currentVersion -Type $Type
    Write-Host "當(dāng)前版本: $currentVersion" -ForegroundColor Cyan
    Write-Host "新版本: $Version" -ForegroundColor Green
  
    $confirm = Read-Host "確認(rèn)發(fā)布版本 $Version? (y/N)"
    if ($confirm -ne "y" -and $confirm -ne "Y") {
        Write-Host "發(fā)布已取消" -ForegroundColor Yellow
        exit 0
    }
}

Write-Host "開(kāi)始發(fā)布版本 $Version..." -ForegroundColor Green

# 創(chuàng)建 Git 標(biāo)簽
try {
    git tag $Version
    git push origin $Version
    Write-Host "Git 標(biāo)簽創(chuàng)建成功" -ForegroundColor Green
} catch {
    Write-Host "Git 標(biāo)簽創(chuàng)建失敗: $_" -ForegroundColor Red
    exit 1
}

# 構(gòu)建和推送 Docker 鏡像
try {
    & ".\scripts\docker-publish.ps1" -Version $Version -Username $Username
    Write-Host "Docker 鏡像發(fā)布成功" -ForegroundColor Green
} catch {
    Write-Host "Docker 鏡像發(fā)布失敗: $_" -ForegroundColor Red
    exit 1
}

Write-Host "版本 $Version 發(fā)布完成!" -ForegroundColor Green

8. 故障排除

8.1 常見(jiàn)問(wèn)題

8.1.1 構(gòu)建失敗

# 清理 Docker 緩存
docker system prune -f

# 清理構(gòu)建緩存
docker builder prune -f

# 重新構(gòu)建(不使用緩存)
docker build --no-cache -t ai-mini-backend:latest .

8.1.2 推送失敗

# 檢查網(wǎng)絡(luò)連接
Test-NetConnection -ComputerName "registry-1.docker.io" -Port 443

# 重新登錄
docker logout
docker login

# 檢查鏡像標(biāo)簽
docker images | Select-String "ai-mini-backend"

8.1.3 權(quán)限問(wèn)題

# 檢查 Docker 用戶組
# 在 Linux 系統(tǒng)中:
# groups $USER
# sudo usermod -aG docker $USER

# 在 Windows 中,確保 Docker Desktop 正在運(yùn)行
Get-Process "Docker Desktop" -ErrorAction SilentlyContinue

8.2 調(diào)試技巧

8.2.1 進(jìn)入容器調(diào)試

# 運(yùn)行容器并進(jìn)入 shell
docker run -it --entrypoint /bin/bash ai-mini-backend:latest

# 在運(yùn)行的容器中執(zhí)行命令
docker exec -it container_name /bin/bash

8.2.2 查看構(gòu)建過(guò)程

# 詳細(xì)構(gòu)建日志
docker build --progress=plain -t ai-mini-backend:latest .

# 查看鏡像層信息
docker history ai-mini-backend:latest

8.2.3 網(wǎng)絡(luò)問(wèn)題診斷

# 測(cè)試容器網(wǎng)絡(luò)
docker run --rm ai-mini-backend:latest curl -I http://www.baidu.com

# 檢查 DNS 解析
docker run --rm ai-mini-backend:latest nslookup google.com

8.3 性能監(jiān)控

# 監(jiān)控容器資源使用
docker stats

# 查看容器詳細(xì)信息
docker inspect ai-mini-backend:latest

# 分析鏡像大小
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

9. 最佳實(shí)踐

9.1 安全最佳實(shí)踐

  1. 使用非 root 用戶運(yùn)行容器
  2. 定期更新基礎(chǔ)鏡像
  3. 掃描鏡像安全漏洞
  4. 使用多階段構(gòu)建減少攻擊面
  5. 不在鏡像中包含敏感信息

9.2 性能最佳實(shí)踐

  1. 優(yōu)化 Dockerfile 層緩存
  2. 使用 .dockerignore 減少構(gòu)建上下文
  3. 選擇合適的基礎(chǔ)鏡像
  4. 合并 RUN 指令減少層數(shù)
  5. 使用多階段構(gòu)建減少鏡像大小

9.3 維護(hù)最佳實(shí)踐

  1. 使用語(yǔ)義化版本控制
  2. 維護(hù)詳細(xì)的變更日志
  3. 自動(dòng)化構(gòu)建和部署流程
  4. 定期清理舊版本鏡像
  5. 監(jiān)控鏡像使用情況

以上就是Python項(xiàng)目Docker倉(cāng)庫(kù)發(fā)布指南的詳細(xì)內(nèi)容,更多關(guān)于Python Docker倉(cāng)庫(kù)發(fā)布的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • kali中python版本的切換方法

    kali中python版本的切換方法

    今天小編就為大家分享一篇kali中python版本的切換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python中self用法實(shí)例詳解

    Python中self用法實(shí)例詳解

    這篇文章主要介紹了Python中self用法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • PyCharm新建.py文件時(shí)默認(rèn)添加信息的實(shí)現(xiàn)

    PyCharm新建.py文件時(shí)默認(rèn)添加信息的實(shí)現(xiàn)

    這篇文章主要介紹了PyCharm新建.py文件時(shí)默認(rèn)添加信息的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 使用Pandas如何讀取多個(gè)分隔方式的文件

    使用Pandas如何讀取多個(gè)分隔方式的文件

    這篇文章主要介紹了使用Pandas如何讀取多個(gè)分隔方式的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python使用Matplotlib繪制基礎(chǔ)可視化圖表的完整指南

    Python使用Matplotlib繪制基礎(chǔ)可視化圖表的完整指南

    在Python中進(jìn)行數(shù)據(jù)可視化,最常用且功能強(qiáng)大的庫(kù)是?Matplotlib,它可以幫助你輕松繪制出柱狀圖,折線圖,餅圖,散點(diǎn)圖等,下面小編就和大家詳細(xì)介紹一下具體實(shí)現(xiàn)方法吧
    2026-05-05
  • Python函數(shù)中*args和**kwargs來(lái)傳遞變長(zhǎng)參數(shù)的用法

    Python函數(shù)中*args和**kwargs來(lái)傳遞變長(zhǎng)參數(shù)的用法

    這篇文章主要介紹了Python編程中使用*args和**kwargs來(lái)傳遞可變參數(shù)的用法,文中舉了變長(zhǎng)參數(shù)的例子,需要的朋友可以參考下
    2016-01-01
  • 8個(gè)讓Python代碼效率翻倍的簡(jiǎn)單技巧

    8個(gè)讓Python代碼效率翻倍的簡(jiǎn)單技巧

    這篇文章主要為大家詳細(xì)介紹了8個(gè)讓Python代碼效率翻倍的簡(jiǎn)單技巧,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以參考一下
    2026-01-01
  • Python實(shí)現(xiàn)自動(dòng)化表單填寫功能

    Python實(shí)現(xiàn)自動(dòng)化表單填寫功能

    在Python中,自動(dòng)化表單填寫可以通過(guò)多種庫(kù)和工具實(shí)現(xiàn),本文將詳細(xì)介紹常用的自動(dòng)化表單處理工具,并對(duì)它們進(jìn)行橫向比較,可根據(jù)需求選擇合適的工具,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2025-03-03
  • Python Deque 模塊使用詳解

    Python Deque 模塊使用詳解

    Deque模塊是Python標(biāo)準(zhǔn)庫(kù)collections中的一項(xiàng). 它提供了兩端都可以操作的序列, 這意味著, 你可以在序列前后都執(zhí)行添加或刪除.
    2014-07-07
  • 將Python程序部署到Ubuntu系統(tǒng)的完整流程

    將Python程序部署到Ubuntu系統(tǒng)的完整流程

    本文介紹了將Python程序部署到Ubuntu系統(tǒng)的完整流程,包括前期準(zhǔn)備、上傳程序、配置運(yùn)行環(huán)境以及后臺(tái)持久運(yùn)行,還提供了解決常見(jiàn)問(wèn)題的方法,推薦使用FileZilla上傳程序及systemd實(shí)現(xiàn)開(kāi)機(jī)自啟,需要的朋友可以參考下
    2026-04-04

最新評(píng)論

锦州市| 东光县| 怀化市| 开原市| 沙湾县| 马山县| 格尔木市| 名山县| 阿鲁科尔沁旗| 吴堡县| 和硕县| 兴城市| 修水县| 万载县| 龙州县| 芦山县| 大邑县| 双流县| 盐津县| 永川市| 航空| 海淀区| 神池县| 成安县| 子长县| 乌恰县| 巴塘县| 曲阜市| 淮北市| 辛集市| 台北市| 类乌齐县| 玛多县| 吴旗县| 沁阳市| 吉林市| 桑日县| 钦州市| 乌拉特中旗| 格尔木市| 开封市|