跟Trae合作完成项目的docker部署
一、前情回顾
这是张小白Vibe Coding系列的新文章。也是Trae系列的第5篇。
前4篇是:
1、Trae AI编程实践 https://blog.csdn.net/snmper/article/details/158267374
https://blog.csdn.net/snmper/article/details/158267374
2、使用Trae搭建原型实战 https://blog.csdn.net/snmper/article/details/158267526
https://blog.csdn.net/snmper/article/details/158267526
3、使用Trae让应用系统具备AI能力 https://blog.csdn.net/snmper/article/details/158613467
https://blog.csdn.net/snmper/article/details/158613467
4、让Trae开发“完整”的项目 https://blog.csdn.net/snmper/article/details/158613467
https://blog.csdn.net/snmper/article/details/158613467
在 https://zhuanlan.zhihu.com/p/2008113969076905010
https://zhuanlan.zhihu.com/p/2008113969076905010
一文中,张小白提到了“AI IDE工具如何生成docker镜像文件和相应的部署脚本?”的问题。
张小白几乎花了一整天的时间,折腾来折腾去,总算解决了这个问题。
二、目的和方法
1、Why Docker?
首先当然要解释一下为啥张小白要搞定docker问题。
因为对于一般人员来说,搞一个docker镜像可能要比自己从头去安装去配置要简单得多。
docker启动后,应用可以自动启动,做到开箱即用。
而且,docker可以做到随地部署,不会因为你的环境是windows,还是ubuntu,WSL而让安装复杂很多。
对此,“文心一言”专家的解释是:
使用Docker安装应用的核心优势体现在环境一致性、资源效率、部署速度、隔离性及生态支持五大维度,具体如下: 1. 环境一致性:跨平台零差异运行 问题根除:通过镜像打包应用代码、依赖库、配置文件及操作系统层(如Alpine Linux),确保在开发、测试、生产环境及不同硬件平台(Linux/Windows/macOS)中行为一致,彻底解决“在我的机器上能跑”的兼容性问题。 版本控制:镜像支持标签化版本管理(如nginx:1.25.3),结合Docker Hub或私有仓库实现版本回滚与依赖追踪。 2. 轻量级与资源高效利用 启动速度:容器基于宿主机内核运行,启动时间从虚拟机的分钟级缩短至秒级(实验显示启动100个Nginx容器仅需30秒)。 资源占用:相比虚拟机需完整操作系统(10GB+),Docker镜像仅包含应用及依赖(典型大小5MB-1GB),内存占用降至MB级,同一宿主机可运行数百个容器,资源利用率提升3-5倍。 弹性扩展:支持按需动态扩缩容,如Kubernetes自动根据流量增加/减少容器实例,实现水平扩展与负载均衡。 3. 快速部署与持续集成 一键部署:通过docker run命令即可启动容器,结合Dockerfile声明式配置(如FROM python:3.9、COPY . .),实现“一次构建,处处运行”。 CI/CD集成:与Jenkins、GitLab CI、GitHub Actions等工具无缝对接,自动化完成构建、测试、镜像推送及生产环境部署,加速开发迭代周期。 开发环境标准化:团队成员可共享相同开发环境镜像,避免依赖冲突,提升协作效率。 4. 隔离性与安全性 进程级隔离:通过Linux Namespaces(进程、网络、文件系统隔离)和Cgroups(资源限制)实现容器间互不干扰,避免应用冲突。 安全增强:支持Seccomp系统调用过滤、AppArmor配置文件限制权限,结合镜像扫描工具(如Snyk)检测漏洞,及时修复安全风险。 最小权限原则:容器默认以非root用户运行,减少潜在攻击面。 5. 可移植性与生态支持 跨平台迁移:镜像可在本地、云平台(AWS ECS、阿里云容器服务)、边缘设备间自由迁移,支持混合云与多云架构。 微服务架构:每个微服务独立打包为容器,技术栈选择灵活(如Java、Go、Node.js),结合服务网格(如Istio)实现服务发现、流量管理与监控。 生态繁荣:Docker Hub提供海量官方及社区镜像(如MySQL、Redis、Nginx),私有仓库支持企业级镜像管理,配套工具链完善(如Compose、Swarm、Kubernetes)6. 附加价值
成本优化:减少硬件资源浪费,降低服务器采购与运维成本。
灾难恢复:快速重建容器实例,结合数据卷(Volume)实现持久化存储,保障业务连续性。
实验与测试:快速搭建隔离的测试环境,支持A/B测试、金丝雀发布等场景。
适用场景推荐:开发/测试:快速搭建一致环境,支持并行测试与自动化测试。
生产部署:微服务架构、高并发应用、弹性伸缩场景(如电商大促、实时数据处理)。
云原生:Serverless架构、函数计算、边缘计算(如IoT设备管理)。注意事项:
安全配置:避免容器以root权限运行,定期更新镜像与依赖库。
存储管理:使用数据卷或绑定挂载实现持久化存储,避免容器删除导致数据丢失。
网络配置:根据场景选择桥接、主机或覆盖网络模式,确保容器间通信安全高效。
通过Docker容器化,企业可实现开发、测试、部署流程的标准化与自动化,提升研发效率与系统稳定性,同时降低运维成本与资源消耗,是云原生时代应用交付的核心技术之一。
2、How Docker?
在docker的安装部署中,也会存在很多问题,最大的问题是:docker镜像文件取不下来。
技术是没有国界的,但是技术公司有。当docker已经几乎成为很多软件的安装标配的时候,docker.com:

就跟github.com、huggingface.co、openai.com、claude.com一样,变成了一条难以跨越的鸿沟:

尽管它应该是这样的:

所以,有可能你需要借助“镜像站”这个东西:

三、踩坑实录
那么,下面就把在跟Trae合作的过程中“一路以来趟过的坑”说一下。
1、docker启动条件
部署docker的前提就是张小白已经跟Trae合作,把第一代系统原型搭建好,并基本完成了一轮所有功能的测试。




如果你还没调试完代码,就急着想去用docker部署,那么正常部署有什么功能BUG,docker部署就有什么功能BUG,同样的BUG只会多不会少。
2、启动docker部署工作






Trae洋洋洒洒做了一大堆事情,不仅把相关的docker部署脚本给你做好了,还写了个手册,把如何使用,甚至系统架构图都画出来给你看了。
看起来很美的样子。
但其实真的是这样吗?
在规划部署这块,Trae确实很棒。
但是,后面确实发生了很多很多。我们一一来说明。
3、docker环境连错库了
这个问题原本不应该出现的。因为一开始是把数据库信息放到 config/database.js文件里面,后来考虑到本地的安全性,就把数据库信息放到.env文件里面:

这样,提交git版本的时候,就不会把敏感的数据库用户名和密码传到gitee上。
但是,居然Trae有些编码把数据库连接串写死在代码中了:



这个问题如果想避免,似乎就要引用SPEC机制。让Trae在写代码的过程中遵循一定的编码规范。比如制定“数据库配置仅允许放在.env文件中”这种规则。
4、docker镜像内访问不了外网
docker镜像在没有做好足够的网络配置前,是无法访问外网的,这就导致原来前端程序中一个很简单的 “引用公网CDN上的js文件的代码”,变的不可用。而这时最好的办法就是【把相关的js文件下载到本地,而项目工程直接引用本地的文件】。


5、数据库字符集不一致导致的乱码



像张小白这样的码农,最烦的就是字符集乱码问题。好在这个问题,跟Trae一说,它就吭呲吭呲的解决了。
6、MySQL数据库版本不同问题
这点张小白没有完全想到。
张小白本地测试的时候,用的版本是:

但是docker镜像使用的MySQL镜像的版本是:


MySQL5和MySQL8在代码上的差异还是有不少的,应该说,8比5有更多严格的限制。
比如:
(1)MySQL prepared statement 不支持 LIMIT 和 OFFSET 的参数绑定。需要直接拼接数字:


(2)MySQL8对NULL有更严格的限制


好在Trae挺会举一反三的,它发现了这个问题之后,就顺便检查了其他的代码是否都有类似的问题,然后一并改进了。(要是码农,可能还不会想到那么多,最可能是动作是:下次遇到了问题再说。。。)
(3)MySQL 8.0 的严格模式不允许0000-00-00 00:00:00作为默认值

7、基础数据表的记录数不对导致查询结果异常



数据初始化一直是系统移植中最关键的工作。
数据初始化必须检查导入的数据跟导出的数据是否相符。所以这部分的检查非常关键,它影响到了安装后的系统是否能正常运行。
BTW:模型调用失败1:Coding Plan超限额了:
在docker迁移的过程中,张小白还遇到了其他的问题,比如说:

张小白的方舟Coding Plan限额用完了。
BTW2:模型调用失败2:GLM的CodingPlan服务吃不消了

BTW3:另一件细思极恐的Trae烧操作
在一开始验证docker的时候,包括下载docker镜像,启动docker镜像的过程中,都发生过失败。而Trae对失败的处理过程中,曾经做过一件非常恐怖的事情:
Trae宣布:

于是,它提供了一个代码:

查找到你电脑上所有的镜像,并且删除之。。
问你要不要执行!
你说我执行不执行?幸好你问了。不然你闷头执行了。我岂不是这几年都白干了?!
我突然想到最近发生在OpenClaw把某大厂的200多封邮件删掉的事情:
https://zhuanlan.zhihu.com/p/2009613685228839023
https://zhuanlan.zhihu.com/p/2009613685228839023
所以此处,张小白再次警告码农们(或者是想玩vibe coding的其他人类)。Vibe Coding其实跟OpenClaw有类似的安全风险,它会要你一些比较高级的权限。比如删文件,比如执行一些烧操作,千万小心了。如果不行的话,问一下LLM,这种操作安全吗,然后再去让Trae执行(或者询问技术专家):



因为AI,它有时候是不知道自己的操作结果会带来怎样的后果,但是码农你是需要承担后果的。
四、总结与docker部署工程展示
所以把一个Vibe Coding工程实现docker部署,需要解决的问题还是不少的。张小白应该把上述规则整理起来,做成代码规范SPEC,让张小白的下一个工程不再犯错。
然而,可能更重要的是:在docker环境中,还是要重新做好功能测试的。
那下面我们把目前调试好的docker部署给大家看看效果。
1、准备项目代码仓
cd F:\mydocker git clone https://gitee.com/zhanghui_china/cook cd cook
或者获取最新版本
git pull

2、下好两个docker镜像文件
其实docker在部署的过程中,会自动去下载镜像的,但是它老是失败,于是张小白不得不用命令行先完成对项目所需的必要的镜像的下载,包含mysql:8.0:
docker pull mysql:8.0

node:18-alpine:
docker pull node:18-alpine

一般用户也可以不管这个,但是可能会出现docker镜像无法下载导致的问题。(当然,今后张小白可能会提供docker镜像的本地制作版本)
3、检查docker镜像
docker images

4、配置docker参数
将docker.env.sample文件复制成docker.env文件,并修改相关的配置:

5、开始docker部署
如果以前装过,可以先清理:
docker-compose down -v

再开始部署:
docker-compose -f docker-compose.quick.yml up -d

5、检查启动日志

看起来基本正常。
6、进行系统试用
浏览器打开:







看起来一切正常。(如果你家有个5岁的男孩,那么恭喜你,上面的建议对你来说是有用的。但是到底怎么吃饭吃菜才能获得营养,敬请期待张小白的后续版本)。
更多推荐
所有评论(0)