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

忘机山人

发布于336天前
博客图片修整中,看不了可以先搜索公众号“忘机山人”看。
 
我们上一篇讲述了如何打包上架 APP,这期我们就来看如何远程调试即将上架的 APP。

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



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

```json
{
"repositories": [
"debug.bridge/231ee20d4e4d8edbd2004e7609fd9c15",
"debug.bridge/ddc6dbf609125b7bd2c0efb0ed4254d1",
"helloworld"
]
}
```



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

```yml
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 了。

```
跳过执行 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 ,这样工作区就被清理干净了。

```bash
(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就是数据持久化的目录。如果在这里新建一个目录,那么就可以在网盘里实时看到。

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



![image-20250702063901802](https://raw.githubusercontent.com/cloudsmithy/picgo-imh/master/image-20250702063901802.png)

以上就是devshell的全部内容了,如果你需要借助微服的一些特性还进行开发,比如获取环境变量,OIDC什么的,可以用这个方法来轻松调试。
![c65b5d34d8a94561d23a8c6ddf79dfcc.jpg](https://dl.playground.lazycat.cloud/guidelines/459/2b3771e9-4e2d-412b-8ca9-176a3e8e7164.jpg "c65b5d34d8a94561d23a8c6ddf79dfcc.jpg")

评论

0

暂无评论

说点什么呢~
收藏
1
0
0