Python項(xiàng)目Docker倉(cāng)庫(kù)發(fā)布指南
概述
本文檔詳細(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)
- 訪問(wèn) Docker Hub
- 注冊(cè)賬號(hào)或登錄現(xiàn)有賬號(hào)
- 創(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)備工作
- 登錄 阿里云控制臺(tái)
- 開(kāi)通容器鏡像服務(wù)
- 創(chuàng)建命名空間和鏡像倉(cāng)庫(kù)
- 獲取訪問(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)備工作
- 登錄 騰訊云控制臺(tái)
- 開(kāi)通容器鏡像服務(wù)
- 創(chuàng)建命名空間和鏡像倉(cāng)庫(kù)
- 獲取訪問(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í)踐
- 使用非 root 用戶運(yùn)行容器
- 定期更新基礎(chǔ)鏡像
- 掃描鏡像安全漏洞
- 使用多階段構(gòu)建減少攻擊面
- 不在鏡像中包含敏感信息
9.2 性能最佳實(shí)踐
- 優(yōu)化 Dockerfile 層緩存
- 使用 .dockerignore 減少構(gòu)建上下文
- 選擇合適的基礎(chǔ)鏡像
- 合并 RUN 指令減少層數(shù)
- 使用多階段構(gòu)建減少鏡像大小
9.3 維護(hù)最佳實(shí)踐
- 使用語(yǔ)義化版本控制
- 維護(hù)詳細(xì)的變更日志
- 自動(dòng)化構(gòu)建和部署流程
- 定期清理舊版本鏡像
- 監(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)希爾密碼加密,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Python解決拋小球問(wèn)題 求小球下落經(jīng)歷的距離之和示例
這篇文章主要介紹了Python解決拋小球問(wèn)題 求小球下落經(jīng)歷的距離之和,涉及Python基于遞歸的數(shù)值計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
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í)例代碼
矩陣是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)題,主要介紹了字符串轉(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ù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
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í)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
解決python3 HTMLTestRunner測(cè)試報(bào)告中文亂碼的問(wèn)題
今天小編就為大家分享一篇解決python3 HTMLTestRunner測(cè)試報(bào)告中文亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

