欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 依賴(lài)
└── .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
    鏡像名稱(chēng),默認(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ù):寫(xiě)入彩色日志
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)建完整的鏡像名稱(chēng)
if ($Namespace) {
    $fullImageName = "$Registry/$Namespace/$ImageName"
} else {
    if ($Registry -eq "docker.io") {
        $fullImageName = "$Username/$ImageName"
    } else {
        $fullImageName = "$Registry/$Username/$ImageName"
    }
}

Write-ColorLog "完整鏡像名稱(chēng): $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)建依賴(lài)
RUN apt-get update && apt-get install -y \
    gcc \
    default-libmysqlclient-dev \
    pkg-config \
    && rm -rf /var/lib/apt/lists/*

# 復(fù)制并安裝 Python 依賴(lài)
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í)依賴(lài)
RUN apt-get update && apt-get install -y \
    default-libmysqlclient-dev \
    curl \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# 從構(gòu)建階段復(fù)制已安裝的依賴(lài)
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ā)布類(lèi)型: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)文章

  • python實(shí)現(xiàn)希爾密碼加密的示例代碼

    python實(shí)現(xiàn)希爾密碼加密的示例代碼

    本文主要介紹了python實(shí)現(xiàn)希爾密碼加密,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Python解決拋小球問(wèn)題 求小球下落經(jīng)歷的距離之和示例

    Python解決拋小球問(wèn)題 求小球下落經(jīng)歷的距離之和示例

    這篇文章主要介紹了Python解決拋小球問(wèn)題 求小球下落經(jīng)歷的距離之和,涉及Python基于遞歸的數(shù)值計(jì)算相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • python 自動(dòng)提交和抓取網(wǎng)頁(yè)

    python 自動(dòng)提交和抓取網(wǎng)頁(yè)

    最近在研究怎么樣做個(gè)自動(dòng)發(fā)帖器,要完成這個(gè)工具難度蠻大的,驗(yàn)證碼就是一個(gè)大問(wèn)題(還沒(méi)有想到解決辦法哦,不管了),先要解決的是如何抓取,分析和提交頁(yè)面的問(wèn)題。
    2009-07-07
  • Python?numpy生成矩陣基礎(chǔ)用法實(shí)例代碼

    Python?numpy生成矩陣基礎(chǔ)用法實(shí)例代碼

    矩陣是matrix類(lèi)型的對(duì)象,該類(lèi)繼承自numpy.ndarray,任何針對(duì)ndarray的操作,對(duì)矩陣對(duì)象同樣有效,下面這篇文章主要給大家介紹了關(guān)于Python?numpy生成矩陣基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 最新python 字符串?dāng)?shù)組互轉(zhuǎn)問(wèn)題

    最新python 字符串?dāng)?shù)組互轉(zhuǎn)問(wèn)題

    這篇文章主要介紹了最新python 字符串?dāng)?shù)組互轉(zhuǎn)問(wèn)題,主要介紹了字符串轉(zhuǎn)list數(shù)組問(wèn)題和list數(shù)組轉(zhuǎn)字符串問(wèn)題,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • python中的queue隊(duì)列類(lèi)型及函數(shù)用法

    python中的queue隊(duì)列類(lèi)型及函數(shù)用法

    這篇文章主要介紹了python中的queue隊(duì)列類(lèi)型及函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • pyqt5?子線程如何操作主線程GUI(示例代碼)

    pyqt5?子線程如何操作主線程GUI(示例代碼)

    這篇文章主要介紹了pyqt5?子線程如何操作主線程GUI,在使用pyqt5編寫(xiě)gui時(shí)遇到兩個(gè)問(wèn)題,會(huì)導(dǎo)致界面崩潰,今天就圍繞這兩個(gè)問(wèn)題來(lái)簡(jiǎn)單說(shuō)明和改進(jìn),需要的朋友可以參考下
    2024-05-05
  • win8下python3.4安裝和環(huán)境配置圖文教程

    win8下python3.4安裝和環(huán)境配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了win8下python3.4安裝和環(huán)境配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • python?如何實(shí)現(xiàn)跳過(guò)異常繼續(xù)執(zhí)行

    python?如何實(shí)現(xiàn)跳過(guò)異常繼續(xù)執(zhí)行

    這篇文章主要介紹了python?如何實(shí)現(xiàn)跳過(guò)異常繼續(xù)執(zhí)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 解決python3 HTMLTestRunner測(cè)試報(bào)告中文亂碼的問(wèn)題

    解決python3 HTMLTestRunner測(cè)試報(bào)告中文亂碼的問(wèn)題

    今天小編就為大家分享一篇解決python3 HTMLTestRunner測(cè)試報(bào)告中文亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12

最新評(píng)論