#!/usr/bin/env bash # 将当前运行的 massive-point-cloud-app-dev 容器固化为镜像,避免下次从 Dockerfile 全量重建。 # # 限制(必读): # - 绑定挂载 .:/app 下的代码改动在 commit 时不会打进镜像(运行时仍用宿主机目录)。 # - app-node-modules 是命名卷,commit 不会包含 node_modules;勿对 app 执行 docker compose down -v, # 否则需重新 pnpm install(卷在则依赖仍在)。 # - 在容器内装到 /usr、/usr/local 等的 apt/pip 等会随 commit 保留。 # # 用法: # chmod +x scripts/snapshot-app-dev-image.sh # ./scripts/snapshot-app-dev-image.sh # 标签 massive-point-cloud-app-dev:frozen-YYYYMMDD # ./scripts/snapshot-app-dev-image.sh mytag # 标签 massive-point-cloud-app-dev:mytag # ./scripts/snapshot-app-dev-image.sh mytag ./app-dev-snapshot.tar # 同时 docker save 到文件便于备份/迁移 set -euo pipefail CONTAINER_NAME="${CONTAINER_NAME:-massive-point-cloud-app-dev}" IMAGE_BASENAME="${IMAGE_BASENAME:-massive-point-cloud-app-dev}" TAG="${1:-frozen-$(date +%Y%m%d)}" SAVE_PATH="${2:-}" if ! docker inspect "$CONTAINER_NAME" &>/dev/null; then echo "错误: 找不到容器 $CONTAINER_NAME ,请先启动: docker compose -f docker-compose.dev.yml up -d app" >&2 exit 1 fi FULL_IMAGE="${IMAGE_BASENAME}:${TAG}" echo "正在提交容器 $CONTAINER_NAME -> $FULL_IMAGE" docker commit "$CONTAINER_NAME" "$FULL_IMAGE" echo "已生成镜像: $FULL_IMAGE" if [[ -n "$SAVE_PATH" ]]; then echo "正在导出: docker save -o $SAVE_PATH $FULL_IMAGE" docker save -o "$SAVE_PATH" "$FULL_IMAGE" echo "已保存: $SAVE_PATH" fi cat <