docs: add docker image cleanup update helper

This commit is contained in:
ShukeBta
2026-05-29 10:03:05 +08:00
parent dfe2b3f017
commit b430b5e638
5 changed files with 119 additions and 30 deletions
+4 -1
View File
@@ -1,4 +1,4 @@
.PHONY: all build build-server build-web dev dev-web run deploy docker docker-stop docker-push clean install-web tidy test vet smoke
.PHONY: all build build-server build-web dev dev-web run deploy docker docker-update docker-stop docker-push clean install-web tidy test vet smoke
# ---- 默认目标 ----
all: build
@@ -33,6 +33,9 @@ deploy:
docker:
docker compose up -d
docker-update:
./scripts/docker-compose-update.sh
docker-stop:
docker compose down
+31 -14
View File
@@ -231,7 +231,7 @@ mkdir -p data cache media downloads
```bash
cat > .env <<'EOF'
# 固定版本;需要升级时改成新的 MediaStationGo-vX.Y.Z 后执行 docker compose pull && docker compose up -d
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.10
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.11
MEDIASTATION_HTTP_PORT=18080
# 程序数据和缓存建议放在 MediaStationGo 部署目录下,便于备份和迁移。
@@ -300,7 +300,7 @@ vim docker-compose.yml
#
# 镜像版本:
# 默认拉取 latest;如需固定版本,创建 .env 并写入:
# MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.10
# MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.11
#
# 路径映射总览:
# /data 程序数据目录。保存 SQLite 数据库、JWT secret、系统配置等,必须持久化。
@@ -443,6 +443,14 @@ docker compose up -d
# docker-compose up -d
```
如果是升级已有部署,建议使用仓库提供的更新脚本。它会先拉取并重建容器,再只清理 `ghcr.io/shukebta/mediastation-go` 的旧镜像和 dangling 层,避免 NAS 磁盘被历史镜像占满:
```bash
curl -fsSL https://cdn.jsdelivr.net/gh/ShukeBta/MediaStationGo@main/scripts/docker-compose-update.sh -o docker-compose-update.sh
chmod +x docker-compose-update.sh
./docker-compose-update.sh
```
7. 查看状态与日志:
```bash
@@ -481,13 +489,19 @@ docker compose pull
docker compose up -d
```
后续升级建议在部署目录执行:
```bash
./docker-compose-update.sh
```
### 固定版本部署
建议生产环境固定版本,避免 `latest` 自动变化。NAS 直读推荐 `.env`:
```bash
cat > .env <<'EOF'
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.10
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.11
MEDIASTATION_HTTP_PORT=18080
MEDIASTATION_DATA_DIR=./data
MEDIASTATION_CACHE_DIR=./cache
@@ -692,10 +706,13 @@ docker logs -f mediastation-go
更新镜像:
```bash
docker compose pull
docker compose up -d
curl -fsSL https://cdn.jsdelivr.net/gh/ShukeBta/MediaStationGo@main/scripts/docker-compose-update.sh -o docker-compose-update.sh
chmod +x docker-compose-update.sh
./docker-compose-update.sh
```
说明:普通 `docker compose pull && docker compose up -d` 只会切换到新镜像,不会自动删除旧镜像;上面的脚本会保留当前正在运行的 MediaStationGo 镜像,删除同仓库未使用的旧镜像,并执行 `docker image prune -f` 清理 dangling 层。如需进一步清理所有未使用镜像,可临时执行 `PRUNE_ALL_UNUSED=1 ./docker-compose-update.sh`。
停止服务:
```bash
@@ -747,26 +764,26 @@ cd MediaStationGo
| 平台 | 包名示例 |
| --- | --- |
| Linux x86_64 | `MediaStationGo-v0.0.10-linux-amd64.tar.gz` |
| Linux ARM64 | `MediaStationGo-v0.0.10-linux-arm64.tar.gz` |
| Windows x86_64 | `MediaStationGo-v0.0.10-windows-amd64.zip` |
| macOS Intel | `MediaStationGo-v0.0.10-darwin-amd64.tar.gz` |
| macOS Apple Silicon | `MediaStationGo-v0.0.10-darwin-arm64.tar.gz` |
| Linux x86_64 | `MediaStationGo-v0.0.11-linux-amd64.tar.gz` |
| Linux ARM64 | `MediaStationGo-v0.0.11-linux-arm64.tar.gz` |
| Windows x86_64 | `MediaStationGo-v0.0.11-windows-amd64.zip` |
| macOS Intel | `MediaStationGo-v0.0.11-darwin-amd64.tar.gz` |
| macOS Apple Silicon | `MediaStationGo-v0.0.11-darwin-arm64.tar.gz` |
部署步骤:
```bash
# Linux 示例
tar -xzf MediaStationGo-v0.0.10-linux-amd64.tar.gz
cd MediaStationGo-v0.0.10-linux-amd64
tar -xzf MediaStationGo-v0.0.11-linux-amd64.tar.gz
cd MediaStationGo-v0.0.11-linux-amd64
MEDIASTATION_APP_PORT=18080 ./mediastation-go
```
Windows:
```powershell
Expand-Archive .\MediaStationGo-v0.0.10-windows-amd64.zip
cd .\MediaStationGo-v0.0.10-windows-amd64
Expand-Archive .\MediaStationGo-v0.0.11-windows-amd64.zip
cd .\MediaStationGo-v0.0.11-windows-amd64
$env:MEDIASTATION_APP_PORT = "18080"
.\mediastation-go.exe
```
+30 -13
View File
@@ -228,7 +228,7 @@ mkdir -p data cache media downloads
```bash
cat > .env <<'EOF'
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.10
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.11
MEDIASTATION_HTTP_PORT=18080
MEDIASTATION_DATA_DIR=./data
MEDIASTATION_CACHE_DIR=./cache
@@ -279,6 +279,14 @@ docker compose up -d
# docker-compose up -d
```
For existing deployments, use the update helper. It pulls and recreates the service, then removes old unused `ghcr.io/shukebta/mediastation-go` images and dangling layers so NAS disks do not fill up with historical images:
```bash
curl -fsSL https://cdn.jsdelivr.net/gh/ShukeBta/MediaStationGo@main/scripts/docker-compose-update.sh -o docker-compose-update.sh
chmod +x docker-compose-update.sh
./docker-compose-update.sh
```
7. Check status and logs:
```bash
@@ -317,13 +325,19 @@ docker compose pull
docker compose up -d
```
For later upgrades, run this from the deployment directory:
```bash
./docker-compose-update.sh
```
### Pin a Release Version
For production, pin a specific release tag instead of using `latest`. Recommended NAS `.env`:
```bash
cat > .env <<'EOF'
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.10
MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.11
MEDIASTATION_HTTP_PORT=18080
MEDIASTATION_DATA_DIR=./data
MEDIASTATION_CACHE_DIR=./cache
@@ -514,10 +528,13 @@ docker logs -f mediastation-go
Update:
```bash
docker compose pull
docker compose up -d
curl -fsSL https://cdn.jsdelivr.net/gh/ShukeBta/MediaStationGo@main/scripts/docker-compose-update.sh -o docker-compose-update.sh
chmod +x docker-compose-update.sh
./docker-compose-update.sh
```
Note: plain `docker compose pull && docker compose up -d` switches to the new image but does not remove old images. The helper keeps the currently running MediaStationGo image, removes unused older images from the same repository, and runs `docker image prune -f` for dangling layers. To aggressively remove all unused images, run `PRUNE_ALL_UNUSED=1 ./docker-compose-update.sh`.
Stop:
```bash
@@ -569,25 +586,25 @@ Each release provides multi-platform archives:
| Platform | Package example |
| --- | --- |
| Linux x86_64 | `MediaStationGo-v0.0.10-linux-amd64.tar.gz` |
| Linux ARM64 | `MediaStationGo-v0.0.10-linux-arm64.tar.gz` |
| Windows x86_64 | `MediaStationGo-v0.0.10-windows-amd64.zip` |
| macOS Intel | `MediaStationGo-v0.0.10-darwin-amd64.tar.gz` |
| macOS Apple Silicon | `MediaStationGo-v0.0.10-darwin-arm64.tar.gz` |
| Linux x86_64 | `MediaStationGo-v0.0.11-linux-amd64.tar.gz` |
| Linux ARM64 | `MediaStationGo-v0.0.11-linux-arm64.tar.gz` |
| Windows x86_64 | `MediaStationGo-v0.0.11-windows-amd64.zip` |
| macOS Intel | `MediaStationGo-v0.0.11-darwin-amd64.tar.gz` |
| macOS Apple Silicon | `MediaStationGo-v0.0.11-darwin-arm64.tar.gz` |
Linux example:
```bash
tar -xzf MediaStationGo-v0.0.10-linux-amd64.tar.gz
cd MediaStationGo-v0.0.10-linux-amd64
tar -xzf MediaStationGo-v0.0.11-linux-amd64.tar.gz
cd MediaStationGo-v0.0.11-linux-amd64
MEDIASTATION_APP_PORT=18080 ./mediastation-go
```
Windows example:
```powershell
Expand-Archive .\MediaStationGo-v0.0.10-windows-amd64.zip
cd .\MediaStationGo-v0.0.10-windows-amd64
Expand-Archive .\MediaStationGo-v0.0.11-windows-amd64.zip
cd .\MediaStationGo-v0.0.11-windows-amd64
$env:MEDIASTATION_APP_PORT = "18080"
.\mediastation-go.exe
```
+7 -2
View File
@@ -6,13 +6,18 @@
# 3. docker compose up -d
# 4. 浏览器打开 http://<服务器IP>:18080
#
# 推荐更新命令(会清理本项目旧镜像,避免 NAS 磁盘堆满):
# curl -fsSL https://cdn.jsdelivr.net/gh/ShukeBta/MediaStationGo@main/scripts/docker-compose-update.sh -o docker-compose-update.sh
# chmod +x docker-compose-update.sh
# ./docker-compose-update.sh
#
# 默认账号:
# admin / admin123
# 首次部署后请立即到「个人资料/用户管理」修改密码。
#
# 镜像版本:
# 默认拉取 latest;如需固定版本,创建 .env 并写入:
# MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.10
# MEDIASTATION_IMAGE_TAG=MediaStationGo-v0.0.11
#
# 路径映射总览:
# /data 程序数据目录。保存 SQLite 数据库、JWT secret、系统配置等,必须持久化。
@@ -54,7 +59,7 @@ services:
mediastation-go:
image: ghcr.io/shukebta/mediastation-go:${MEDIASTATION_IMAGE_TAG:-latest}
# 默认只在本地没有镜像时拉取,避免每次重启都访问 GHCR。
# 需要升级时手动执行:docker compose pull && docker compose up -d
# 需要升级时建议执行 ./docker-compose-update.sh,更新后会清理本项目旧镜像。
pull_policy: missing
container_name: mediastation-go
restart: unless-stopped
+47
View File
@@ -0,0 +1,47 @@
#!/usr/bin/env bash
set -euo pipefail
IMAGE="${MEDIASTATION_IMAGE:-ghcr.io/shukebta/mediastation-go}"
SERVICE="${MEDIASTATION_SERVICE:-mediastation-go}"
CONTAINER="${MEDIASTATION_CONTAINER:-mediastation-go}"
PRUNE_DANGLING="${PRUNE_DANGLING:-1}"
PRUNE_ALL_UNUSED="${PRUNE_ALL_UNUSED:-0}"
if docker compose version >/dev/null 2>&1; then
COMPOSE=(docker compose)
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE=(docker-compose)
else
echo "docker compose / docker-compose not found" >&2
exit 1
fi
echo "==> Pulling latest configured image"
"${COMPOSE[@]}" pull "$SERVICE"
echo "==> Recreating service"
"${COMPOSE[@]}" up -d "$SERVICE"
running_image_id="$(docker inspect -f '{{.Image}}' "$CONTAINER" 2>/dev/null || true)"
if [[ -z "$running_image_id" ]]; then
echo "WARN: container '$CONTAINER' not found, skip project image cleanup" >&2
else
echo "==> Removing old unused $IMAGE images"
while IFS= read -r image_id; do
[[ -z "$image_id" || "$image_id" == "$running_image_id" ]] && continue
docker rmi "$image_id" >/dev/null 2>&1 || true
done < <(docker image ls "$IMAGE" --format '{{.ID}}' | sort -u)
fi
if [[ "$PRUNE_DANGLING" == "1" ]]; then
echo "==> Pruning dangling image layers"
docker image prune -f >/dev/null
fi
if [[ "$PRUNE_ALL_UNUSED" == "1" ]]; then
echo "==> Pruning all unused images"
docker image prune -a -f >/dev/null
fi
echo "Done. Current image:"
docker image ls "$IMAGE" --format ' {{.Repository}}:{{.Tag}} {{.ID}} {{.Size}}' | head -n 20