我们上一篇讲述了如何打包上架 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 也同样会生效。如果你要跑一些初始化脚本,可以在使用这两个办法
- 在 lzc-manifest.yml 文件中使用/api/=exec://3000,./lzcapp/pkg/content/backend/run.sh
- 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
|
我们可以看到文件夹的内容已经被同步过来了,我们可以实时同步开发机文件的创建和修改。不过目前和移动,重命名相关的同步有点小问题,具体表现为
- 本地删除旧的文件,但是 devshell 里不会同步删除
- 删除文件 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 devshell (base) lzcbox-029c588e /data/app/cache/cloud.lazycat.app.todolistpy (base) lzcbox-029c588e /data/app/cache/cloud.lazycat.app.todolistpy/devshell 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
|

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