feat: 新增 TenantApi watch 脚本

This commit is contained in:
root
2026-01-30 01:19:25 +00:00
parent 65fecf74e8
commit 594b50b276
2 changed files with 138 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env bash
# 用法:在 Linux 终端执行本脚本,后台启动 TenantApi 的 dotnet watch开发用不需要 docker build
# 前置:已安装并运行 Docker。
set -euo pipefail
trap 'echo "发生错误:${BASH_COMMAND}" >&2' ERR
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
repo_root="$(cd "${script_dir}/.." && pwd)"
container_name="${CONTAINER_NAME:-takeout.api.tenant}"
docker_network="${DOCKER_NETWORK:-web_apps}"
host_port="${HOST_PORT:-7903}"
container_port="${CONTAINER_PORT:-7903}"
sdk_image="${SDK_IMAGE:-mcr.microsoft.com/dotnet/sdk:10.0}"
nuget_volume="${NUGET_VOLUME:-takeout-nuget}"
project_path="${PROJECT_PATH:-src/Api/TakeoutSaaS.TenantApi/TakeoutSaaS.TenantApi.csproj}"
environment="${ASPNETCORE_ENVIRONMENT:-Development}"
echo "工作目录:${repo_root}"
echo "使用 SDK 镜像:${sdk_image}"
echo "容器:${container_name} 端口:${host_port}:${container_port} 网络:${docker_network}"
echo "项目:${project_path} 环境:${environment}"
# 1. (空行后) 确保 network 存在(用于连接同网络内的 postgres/redis 等依赖)
if [ -n "${docker_network}" ]; then
if ! docker network inspect "${docker_network}" >/dev/null 2>&1; then
echo "Docker network 不存在,正在创建:${docker_network}"
docker network create "${docker_network}" >/dev/null
fi
fi
# 2. (空行后) 持久化 NuGet 缓存,加速 restore/build
if ! docker volume inspect "${nuget_volume}" >/dev/null 2>&1; then
echo "NuGet volume 不存在,正在创建:${nuget_volume}"
docker volume create "${nuget_volume}" >/dev/null
fi
# 3. (空行后) 替换旧容器(如存在)
if docker ps -a --format '{{.Names}}' | grep -qx "${container_name}"; then
echo "发现旧容器,正在移除:${container_name}"
docker rm -f "${container_name}" >/dev/null
fi
run_args=()
if [ -n "${docker_network}" ]; then
run_args+=(--network "${docker_network}")
fi
echo "启动 dotnet watch后台运行..."
docker run -d --name "${container_name}" \
"${run_args[@]}" \
-p "${host_port}:${container_port}" \
-v "${repo_root}":/src \
-w /src \
-v "${nuget_volume}":/root/.nuget/packages \
-e ASPNETCORE_ENVIRONMENT="${environment}" \
-e ASPNETCORE_URLS="http://+:${container_port}" \
-e DOTNET_USE_POLLING_FILE_WATCHER=1 \
-e DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER=1 \
"${sdk_image}" \
dotnet watch --project "${project_path}" run
echo "已启动。查看日志docker logs -f ${container_name}"
echo "Swaggerhttp://localhost:${host_port}/api/docs (兼容入口 /swagger"

View File

@@ -0,0 +1,73 @@
<#
用法:在 PowerShell 中执行本脚本,后台启动 TenantApi 的 dotnet watch开发用不需要 docker build
前置:已安装并运行 Docker Desktop。
#>
trap {
Write-Host "发生错误:" $_ -ForegroundColor Red
Read-Host "按回车关闭窗口"
exit 1
}
$ErrorActionPreference = 'Stop'
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$repoRoot = Split-Path -Parent $scriptDir
$containerName = if ($env:CONTAINER_NAME) { $env:CONTAINER_NAME } else { 'takeout.api.tenant' }
$dockerNetwork = if ($env:DOCKER_NETWORK) { $env:DOCKER_NETWORK } else { 'web_apps' }
$hostPort = if ($env:HOST_PORT) { $env:HOST_PORT } else { '7903' }
$containerPort = if ($env:CONTAINER_PORT) { $env:CONTAINER_PORT } else { '7903' }
$sdkImage = if ($env:SDK_IMAGE) { $env:SDK_IMAGE } else { 'mcr.microsoft.com/dotnet/sdk:10.0' }
$nugetVolume = if ($env:NUGET_VOLUME) { $env:NUGET_VOLUME } else { 'takeout-nuget' }
$projectPath = if ($env:PROJECT_PATH) { $env:PROJECT_PATH } else { 'src/Api/TakeoutSaaS.TenantApi/TakeoutSaaS.TenantApi.csproj' }
$environment = if ($env:ASPNETCORE_ENVIRONMENT) { $env:ASPNETCORE_ENVIRONMENT } else { 'Development' }
Write-Host "工作目录:$repoRoot"
Write-Host "使用 SDK 镜像:$sdkImage"
Write-Host "容器:$containerName 端口:$hostPort`:$containerPort 网络:$dockerNetwork"
Write-Host "项目:$projectPath 环境:$environment"
# 1. (空行后) 确保 network 存在(用于连接同网络内的 postgres/redis 等依赖)
if (-not [string]::IsNullOrWhiteSpace($dockerNetwork)) {
$networkExists = (docker network ls --format '{{.Name}}') -contains $dockerNetwork
if (-not $networkExists) {
Write-Host "Docker network 不存在,正在创建:$dockerNetwork"
docker network create $dockerNetwork | Out-Null
}
}
# 2. (空行后) 持久化 NuGet 缓存,加速 restore/build
$volumeExists = (docker volume ls --format '{{.Name}}') -contains $nugetVolume
if (-not $volumeExists) {
Write-Host "NuGet volume 不存在,正在创建:$nugetVolume"
docker volume create $nugetVolume | Out-Null
}
# 3. (空行后) 替换旧容器(如存在)
if ((docker ps -a --format '{{.Names}}') -contains $containerName) {
Write-Host "发现旧容器,正在移除:$containerName"
docker rm -f $containerName | Out-Null
}
$runArgs = @()
if (-not [string]::IsNullOrWhiteSpace($dockerNetwork)) {
$runArgs += @('--network', $dockerNetwork)
}
Write-Host "启动 dotnet watch后台运行..."
docker run -d --name $containerName @runArgs `
-p "$hostPort`:$containerPort" `
-v "$repoRoot`:/src" `
-w /src `
-v "$nugetVolume`:/root/.nuget/packages" `
-e "ASPNETCORE_ENVIRONMENT=$environment" `
-e "ASPNETCORE_URLS=http://+:$containerPort" `
-e "DOTNET_USE_POLLING_FILE_WATCHER=1" `
-e "DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER=1" `
$sdkImage `
dotnet watch --project $projectPath run
Write-Host "已启动。查看日志docker logs -f $containerName"
Write-Host "Swaggerhttp://localhost:$hostPort/api/docs (兼容入口 /swagger"