uptime-kuma 从 docker run 迁移到 compose:数据卷的坑

背景 uptime-kuma 当初是用 docker run 手起的,命令大概长这样:

bash 复制代码
docker run -d --restart=always \
  -p 3001:3001 \
  -v uptime-kuma:/app/data \
  --name uptime-kuma \
  louislam/uptime-kuma:1

问题:不在 compose 里,服务器重启后要手动管;配置改动没有版本记录;端口暴露公网。

想迁移到 compose,但数据不能丢(里面有告警规则、监控目标、历史记录)。 原因 关键概念:Docker 卷是独立的。

docker run 时创建的卷叫 uptime-kuma

如果直接用 compose 定义同名卷,compose 会自动加项目前缀,变成 xxx_uptime-kuma(新卷)

新容器读新卷,看不到老数据

正确做法:在 compose 里声明 external: true,告诉 compose"用现有的卷,别新建"。

解决 第一步:备份数据(保命)

bash 复制代码
mkdir -p ~/backups/uptime-kuma

docker run --rm \
  -v uptime-kuma:/data \
  -v /home/YOUR_USER/backups/uptime-kuma:/backup \
  alpine \
  tar czf /backup/uptime-kuma-$(date +%F).tar.gz -C /data .

# 验证备份里有 kuma.db
tar tzf ~/backups/uptime-kuma/*.tar.gz | grep kuma.db

看到 kuma.db 才算备份成功。

第二步:写 compose 文件

yaml 复制代码
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: always
    ports:
      - "127.0.0.1:3001:3001"     # 撤下公网
    volumes:
      - uptime-kuma:/app/data
    environment:
      - TZ=Asia/Shanghai
    mem_limit: 256m
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

volumes:
  uptime-kuma:
    external: true                # 🚨 关键!用现有卷,不新建

external: true 是这一篇的核心。 第三步:验证 compose 解析结果

bash 复制代码
docker compose config | grep -A2 "volumes:"
yaml 复制代码
volumes:
  uptime-kuma:
    name: uptime-kuma         ← 必须是 uptime-kuma

如果看到 name: uptime-kuma_uptime-kuma → 🚨 停下,external: true 没生效,会新建卷、丢数据。 第四步:迁移(1 分钟窗口)

bash 复制代码
# 停 + 删旧容器(不加 -v!)
docker stop uptime-kuma
docker rm uptime-kuma

# 确认卷还在
docker volume ls | grep uptime
docker volume inspect uptime-kuma | grep Mountpoint

# 用 compose 起新容器
cd /home/YOUR_USER/uptime-kuma
docker compose up -d

⚠️ docker rm 千万不要加 -v------加了会连卷一起删。 第五步:验证数据完整

bash 复制代码
docker logs uptime-kuma 2>&1 | grep -E "Connected|Listening" | tail -5
csharp 复制代码
[SERVER] INFO: Connected
[SERVER] INFO: Listening on 3001

Connected = 成功读到老数据。浏览器登进去,监控目标、通知配置、历史记录都在。 三个坑 坑 1:忘了 external: true

compose 默认会给卷加项目前缀。docker run 建的 uptime-kuma 卷,到 compose 里会变成 项目名_uptime-kuma------新卷、空的、数据全丢。

坑 2:docker rm 加了 -v

docker rm uptime-kuma 删容器,卷保留。 docker rm -v uptime-kuma 删容器 + 删卷------数据全没。

迁移时永远不加 -v。

坑 3:迁移前后没验证 kuma.db

迁移前 tar 备份里要有 kuma.db,迁移后容器日志里要有 Connected。前后两头都验证,才能保证数据没丢。

外加推荐一部电影:挽救计划 昨天看完的,个人感觉------好看

相关推荐
贾伟康2 分钟前
【化学实验室|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
安全·移动开发·harmonyos·arkts·arkui
wangruofeng6 分钟前
黑色十月:AI 找到的漏洞,两小时数十万次利用
人工智能·安全·php
Swot23 分钟前
知识点:关于数据库范式比较好理解的解释
架构
肝不动了老板30 分钟前
SeaweedFS 原理与实践:从文件上传到分布式存储
架构
爱吃馒头不吃辣34 分钟前
加一道题,改一天代码:题库即数据的降维打击
前端·架构
RaaS10034 分钟前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
万联WANFLOW44 分钟前
LiteLLM 1.107.0 投毒排查实战:依赖、Docker、CI 环境分别怎么查?
安全·docker·llm
HelloWorld0011 小时前
告别手动 SSH 扔包!基于 GitHub Actions + Docker 打造全自动化 CI/CD 极速零停机部署实战(全套脚本+避坑)
架构
这个DBA有点耶2 小时前
索引建了查询却更慢——优化器选错索引与Index Merge的隐藏代价
数据库·架构·代码规范
吴建旭 智宅焕2 小时前
智能家居全国交付中售后服务判断层与执行层的架构分离:上门检测责任边界与交付确定性设计
架构·智能家居