亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

概述

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

1. 準(zhǔn)備工作

1.1 環(huán)境要求

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

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

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

ai_backend_python/
├── Dockerfile              # 生產(chǎn)環(huán)境鏡像
├── Dockerfile.dev          # 開發(fā)環(huán)境鏡像
├── docker-compose.yml      # 服務(wù)編排文件
├── docker-compose.dev.yml  # 開發(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

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

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

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

# 日志文件
logs/
*.log

# 上傳文件
uploads/

# 文檔
docs/
README.md

# 測試文件
tests/

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

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

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)建開發(fā)鏡像

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

2.3 本地測試鏡像

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

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

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

# 等待容器啟動
Start-Sleep -Seconds 10

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

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

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

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

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

2.4 使用 Docker Compose 測試

# 使用 docker-compose 啟動完整服務(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 注冊 Docker Hub 賬號

  1. 訪問 Docker Hub
  2. 注冊賬號或登錄現(xiàn)有賬號
  3. 創(chuàng)建新的倉庫(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ā)布到私有倉庫

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

4.1.1 準(zhǔn)備工作

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

4.1.2 登錄和推送

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

# 登錄阿里云鏡像倉庫
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. 登錄 騰訊云控制臺
  2. 開通容器鏡像服務(wù)
  3. 創(chuàng)建命名空間和鏡像倉庫
  4. 獲取訪問憑證

4.2.2 登錄和推送

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

# 登錄騰訊云鏡像倉庫
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è)置私有倉庫信息
$privateRegistry = "your-private-registry.com:5000"

# 登錄私有倉庫(如果需要認(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. 自動化發(fā)布

5.1 PowerShell 發(fā)布腳本

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

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

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

.PARAMETER Version
    鏡像版本號,例如 "v1.0.0"

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

.PARAMETER Username
    Docker 倉庫用戶名

.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è)置錯誤處理
$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 "錯誤: Docker 未安裝或不在 PATH 中" "Red"
    exit 1
}

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

Write-ColorLog "開始發(fā)布 AI Mini Backend Docker 鏡像..." "Green"
Write-ColorLog "版本: $Version" "Cyan"
Write-ColorLog "倉庫: $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 "開始構(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 "開始標(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 倉庫
Write-ColorLog "登錄 Docker 倉庫..." "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 "開始推送鏡像..." "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 "清理本地鏡像時出現(xiàn)警告: $_" "Yellow"
    }
}

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

5.2 使用發(fā)布腳本

# 設(shè)置執(zhí)行策略(首次使用時)
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 自動發(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 }}"
        # 這里可以添加自動部署邏輯

5.4 配置 GitHub Secrets

在 GitHub 倉庫設(shè)置中添加以下 Secrets:

  • DOCKER_USERNAME: Docker Hub 用戶名
  • DOCKER_PASSWORD: Docker Hub 密碼或訪問令牌

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)行時階段
FROM python:3.11-slim as runtime

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

# 安裝運(yùn)行時依賴
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

# 啟動命令
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 語義化版本控制

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

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

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ā)布開發(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
    自動化版本發(fā)布流程,包括版本標(biāo)記、構(gòu)建、推送等

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

.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ì)算下一個版本
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 "開始發(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 常見問題

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)限問題

# 檢查 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)建過程

# 詳細(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ǎ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. 使用語義化版本控制
  2. 維護(hù)詳細(xì)的變更日志
  3. 自動化構(gòu)建和部署流程
  4. 定期清理舊版本鏡像
  5. 監(jiān)控鏡像使用情況

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

相關(guān)文章

最新評論