懒猫微服开发篇(二):远程调试之 Devshell

我们上一篇讲述了如何打包上架 APP,这期我们就来看如何远程调试即将上架的 APP。

简单来讲,这个 devshell 其实就是在微服上打开了一个虚拟机环境,然后我们可以进去里面测试我们的命令。非要说技术实现,那就是 docker exec 了。只不过是做成了本地和微服之间同步的样子。

输入微服的名字/v2/_catalog,可以看到微服里面 Docker 仓库存放的镜像,debug.bridge 开头的就是 devshell 的 image。

1
2
3
4
5
6
7
{
"repositories": [
"debug.bridge/231ee20d4e4d8edbd2004e7609fd9c15",
"debug.bridge/ddc6dbf609125b7bd2c0efb0ed4254d1",
"helloworld"
]
}

在 lzc-build.yml 里定义了 devshell 的配置,这个的意思是就是安装 node 和 python 的环境,设置国内源,然后讲根目录转发到 5173,这个是 vue 的端口。所以我们可以推断,这个是一个 Vue+python 的全栈项目,所以我们可以开两个终端来进入 devshell,分别调试前后端。

1
2
3
4
5
6
7
8
9
10
11
devshell:
routes:
- /=http://127.0.0.1:5173
dependencies:
- nodejs
- npm
- python3
- py3-pip
setupscript: |
export npm_config_registry=https://registry.npmmirror.com
export PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

使用 lzc-cli project devshell -f 进入 devshell,可以看到这个使用了 registry.lazycat.cloud/lzc-cli/devshell 作为 base image,然后换源安装依赖。最后设置 setupscript 里面的 ENV。而 CMD [“sleep”, “infinity”]会让容器启动后执行sleep infinity` 命令,即无限休眠。目的是防止容器因没有前台进程而自动退出(保持容器处于“运行”状态)。

这里有个问题,如果你在 lzc-manifest.yml 里指定了 routes 也同样会生效。如果你要跑一些初始化脚本,可以在使用这两个办法

  1. 在 lzc-manifest.yml 文件中使用/api/=exec://3000,./lzcapp/pkg/content/backend/run.sh
  2. lzc-build.yml 中注入脚本 setupscript。

如果你偷懒在 lzc-build.yml 里 routes 的执行/api/=exec://3000,./lzcapp/pkg/cache/backend/run.sh,似乎也只能转发端口,不能运行脚本。

从日志看,也就是说还是安装了一个应用程序上去,只不过我们可以通过类似 ssh remote 的方式来动态调试。如果 APP 上架之后,能做的恐怕只有 lzc-docker exec 了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
跳过执行 buildscript
跳过拷贝 contentdir 内容

Dockerfile
STEP 1/4: FROM registry.lazycat.cloud/lzc-cli/devshell:v0.0.5
STEP 2/4: RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
--> Using cache 2302149ded79afb639f9935a07e7ea0d63b5644b10e9890d49ad06786e7b31db
--> 2302149ded79
STEP 3/4: RUN apk add --no-cache bash nodejs npm py3-pip python3 && echo "root:root" | chpasswd
--> Using cache 9bb679fa2c9d10ab1a2433be4c59c852affb2a6844c62ecd9eb8d727505821fb
--> 9bb679fa2c9d
STEP 4/4: CMD ["sleep", "infinity"]
--> Using cache 5ed701af0e0f7040c3dc5409f547b271b4f4e792fd4fcbfc4af8a3abecf8d363
COMMIT debug.bridge/ddc6dbf609125b7bd2c0efb0ed4254d1:latest
--> 5ed701af0e0f
Successfully tagged debug.bridge/ddc6dbf609125b7bd2c0efb0ed4254d1:latest
5ed701af0e0f7040c3dc5409f547b271b4f4e792fd4fcbfc4af8a3abecf8d363
Getting image source signatures
Copying blob sha256:c164879b06ca56693b742ec917059cce495320d4d8f6140bde7e875f53377ea1
Copying blob sha256:69bc8c25bce956e4c34fdfee091c531ffa8660454526ea9f76c956f9b930c57b
Copying blob sha256:98e60e58e2d093fd95b5d5d61ae6dac25bff89ba1b46d42395d480dfb75bddab
Copying blob sha256:d4fc045c9e3a848011de66f34b81f052d4f2c15a17bb196d637e526349601820
Copying blob sha256:b244bd08b327b00bfbbbbf4f424ade914ee891a52d9192a573dbe484e22d86ab
Copying config sha256:5ed701af0e0f7040c3dc5409f547b271b4f4e792fd4fcbfc4af8a3abecf8d363
Writing manifest to image destination
输出lpk包 /Users/xu/Desktop/todolist-py-lzcapp-demo/cloud.lazycat.app.todolistpy-v0.0.1.lpk
开始部署应用
开始安装应用


安装成功!
👉 请在浏览器中访问 https://todolistpy.dev.heiyu.space
👉 并使用微服的用户名和密码登录

+ export 'npm_config_registry=https://registry.npmmirror.com'
+ export 'PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple'
+ set -e
+ mkdir -p /lzcapp/cache/devshell

+ cd /lzcapp/cache/devshell
+ exec /bin/sh
/lzcapp/cache/devshell #
/lzcapp/cache/devshell # ls
README.md backend build.sh lzc-build.yml lzc-icon.png lzc-manifest.yml ui

我们可以看到文件夹的内容已经被同步过来了,我们可以实时同步开发机文件的创建和修改。不过目前和移动,重命名相关的同步有点小问题,具体表现为

  1. 本地删除旧的文件,但是 devshell 里不会同步删除
  2. 删除文件 a,但是把 b 重名为 a,devshell 不会同步更改(但是删除 a 重建可以)

相信这两个小问题修好也只是时间问题,当然也有 workaround。

从/data/app/cache/包名这个目录删除 devshell 文件夹之后,然后重新执行 lzc-cli project devshell -f ,这样工作区就被清理干净了。

1
2
3
4
5
(base) lzcbox-029c588e /data/app/cache/cloud.lazycat.app.todolistpy # ls
devshell
(base) lzcbox-029c588e /data/app/cache/cloud.lazycat.app.todolistpy # cd devshell/
(base) lzcbox-029c588e /data/app/cache/cloud.lazycat.app.todolistpy/devshell # ls
1 1312 README.md backend build.sh lzc-build.yml lzc-icon.png lzc-manifest.yml ui

另外,我们再通过 ssh 进入/data/app 这个目录,有两个子文件夹,一个叫做 cache,一个叫做 var。 cache 就是我们这个 devshell 的工作区。var 就是数据持久化的目录。如果在这里新建一个目录,那么就可以在网盘里实时看到。

1
/data/app/var/xu.deploy.lazycat-nav # touch test

image-20250702063901802

以上就是 devshell 的全部内容了,如果你需要借助微服的一些特性还进行开发,比如获取环境变量,OIDC 什么的,可以用这个方法来轻松调试。

懒猫微服开发篇(二):远程调试之 Devshell

https://xu-hardy.github.io/懒猫微服开发篇(二):远程调试之-devshell/

作者

Xu

发布于

2025-07-03

更新于

2025-07-02

许可协议

评论