52 lines
2.1 KiB
Bash
Executable File
52 lines
2.1 KiB
Bash
Executable File
#!/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 <<EOF
|
||
|
||
后续用固化镜像启动(跳过 Dockerfile 构建):
|
||
|
||
export MASSIVE_APP_DEV_IMAGE=$FULL_IMAGE
|
||
docker compose -f docker-compose.dev.yml -f docker-compose.gpu.yml up -d --no-build
|
||
|
||
若不用 GPU 覆盖文件,可去掉 -f docker-compose.gpu.yml 。
|
||
|
||
勿使用 --build ,否则会按 Dockerfile 重新构建并覆盖本地 tag 的构建结果。
|
||
如需长期默认使用该镜像,可在项目根目录 .env 中写入一行:
|
||
MASSIVE_APP_DEV_IMAGE=$FULL_IMAGE
|
||
EOF
|