mise v2026.10.24(Published 2026-10-30T10:15:02Z,约北京时间 10 月 30 日 18:15)把 experimental 的 daemon 扩到了容器镜像:[daemons.xxx] image=... 走 docker run / podman run,端口只绑 127.0.0.1。本机从 2026.10.19 linux-x64 (2026-10-24) 升到 2026.10.24 linux-x64 (2026-10-30) 后,用 redis:7-alpine 起 daemon,Spring Boot 3.4.5 读 REDIS_PORT 连上,actuator 里 redis 报 UP(version 7.4.12),自定义 /redis/ping 读写一致。

官方 Release Notes 写得很克制:功能是 experimental;mise 自己不 pull/build 镜像,也不替你启动 Docker/Podman 服务;只支持 TCP,且 host 侧一律 127.0.0.1;Windows 上启动容器 daemon 会失败。runtime = "auto"(默认)优先找 docker,否则 podman;也可以用环境变量 MISE_CONTAINER_RUNTIME 指到任意 Docker 兼容 CLI。和 2026.10.19 默认 generate 锁文件 那次一样,先开 [settings] experimental = true,再谈 daemon。

升级时注意:本机 mise self-update 因「最低发布年龄 24h」先选中了 2026.10.23,交互确认被取消后版本仍停在 2026.10.19。要踩 2026.10.24 的容器 daemon,直接装官方 linux-x64 包更干脆:

curl -fsSL -o mise.tar.gz \
  https://github.com/jdx/mise/releases/download/v2026.10.24/mise-v2026.10.24-linux-x64.tar.gz
tar -xzf mise.tar.gz
install -m 755 mise/bin/mise ~/.local/bin/mise
mise --version
# 2026.10.24 linux-x64 (2026-10-30)

项目里最小配置长这样(镜像需本机已有,或交给 docker run 首次拉取;本次预先 docker pull redis:7-alpine):

[settings]
experimental = true

[daemons.redis]
image = "redis:7-alpine"
port = { auto = true, base = 6379 }
proxy = false
ready_cmd = "{{ runtime }} exec {{ container }} redis-cli ping"

mise trust 之后跑 mise daemons start redis。首次会顺带装 pitchfork(本机落到 pitchfork@2.32.4),ready 检查通过后状态是 running,端口 6379:

✔ pitchfork: [.../redis] started on port 6379

$ mise daemons status
Name: .../redis
PID: 1025217
Status: running
Port: 6379

$ docker ps --filter label=dev.mise.daemon \
    --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'
NAMES                                               IMAGE            PORTS
mise-...-redis-...                                  redis:7-alpine   127.0.0.1:6379->6379/tcp

mise env 会导出 REDIS_PORT=6379。容器名带项目 namespace 与短哈希,两个 checkout 不会抢同一个名字;停掉时走 runtime stop,上次被强杀留下的同名容器会在下次 start 前清掉。

Spring Boot 侧用 spring-boot-starter-data-redis + actuator,属性只认环境变量端口:

server.port=8088
spring.data.redis.host=127.0.0.1
spring.data.redis.port=${REDIS_PORT:6379}
management.endpoints.web.exposure.include=health,info
management.endpoint.health.show-details=always
management.health.redis.enabled=true

再加一个读写探针,避免只看 health 不够硬:

@GetMapping("/redis/ping")
public Map<String, Object> ping() {
  String key = "mise:daemon:probe";
  String value = "ok@" + Instant.now();
  redis.opsForValue().set(key, value);
  String roundtrip = redis.opsForValue().get(key);
  Map<String, Object> body = new LinkedHashMap<>();
  body.put("written", value);
  body.put("readBack", roundtrip);
  body.put("match", value.equals(roundtrip));
  return body;
}

在已注入 REDIS_PORT 的 shell 里 mvn -DskipTests package,再起 fat jar。启动日志有 Bootstrapping Spring Data Redis repositories 和 Started DemoApplication in 2.504 seconds。随后:

$ curl -s http://127.0.0.1:8088/actuator/health | jq '.components.redis'
{
  "status": "UP",
  "details": {
    "version": "7.4.12"
  }
}

$ curl -s http://127.0.0.1:8088/redis/ping
{"written":"ok@2026-10-31T00:13:56.570922550Z","readBack":"ok@2026-10-31T00:13:56.570922550Z","match":true}

也就是说:mise 负责按 image 起容器并把端口钉在本机回环;Spring Boot 只消费 REDIS_PORT,不自己管 Docker。官方还提醒 ready_port 可能在容器刚起来、服务尚未应答时就通过,数据库类更适合 ready_cmd(上面那条 redis-cli ping)。

同版本还带了 env._.path 的 position = "append"、代理场景用的 extra_ca_certs、以及 preset 命名端口的 per-worktree auto。主线还是容器 daemon:本地 Java 开发要 Redis/Postgres 时,可以把「装客户端工具」换成「声明镜像 + 端口」,再让 Boot 读导出的 *_PORT。记住它仍是 experimental,生产编排继续交给你们既有的 Compose / K8s 流程。

参考:https://github.com/jdx/mise/releases/tag/v2026.10.24

— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。