From b430b5e6389a5d9451eb7e826cf7ed71d31ac1f8 Mon Sep 17 00:00:00 2001 From: ShukeBta Date: Fri, 29 May 2026 10:03:05 +0800 Subject: [PATCH] docs: add docker image cleanup update helper --- Makefile | 5 +++- README.md | 45 ++++++++++++++++++++---------- README_EN.md | 43 ++++++++++++++++++++--------- docker-compose.yml | 9 ++++-- scripts/docker-compose-update.sh | 47 ++++++++++++++++++++++++++++++++ 5 files changed, 119 insertions(+), 30 deletions(-) create mode 100644 scripts/docker-compose-update.sh diff --git a/Makefile b/Makefile index 445be48..09308d9 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/README.md b/README.md index b070a4d..65a1ccc 100644 --- a/README.md +++ b/README.md @@ -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 ``` diff --git a/README_EN.md b/README_EN.md index 319146e..e72442a 100644 --- a/README_EN.md +++ b/README_EN.md @@ -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 ``` diff --git a/docker-compose.yml b/docker-compose.yml index 04b1875..b90cf37 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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 diff --git a/scripts/docker-compose-update.sh b/scripts/docker-compose-update.sh new file mode 100644 index 0000000..a13ecef --- /dev/null +++ b/scripts/docker-compose-update.sh @@ -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