Codex在Docker项目里改了代码,容器里为什么还是旧版本?Volume、Build Cache与工作目录排查
使用 Codex 修改 Docker 项目时,经常会遇到一种很典型的问题:
本地文件明明已经改了,但容器里运行的还是旧代码。
常见表现包括:
-
Codex已经修改源码,页面却没有变化;
-
重启容器以后仍然是旧版本;
-
本地文件和容器里的文件内容不一致;
-
重新执行
docker compose up也没有生效; -
只有重新 Build 镜像以后才恢复正常。
这种情况很多时候不是 Codex 没改成功,而是:
宿主机代码、Docker镜像和运行中的容器并不是同一层东西。
一、先确认Codex到底改了哪份代码
假设本地项目在:
/project/app
但机器上还存在:
/project/app-copy
/project/app-test
如果 Codex 修改的是 app-test,而 Docker Compose 挂载的是 /project/app,容器当然不会发生变化。
可以先确认当前项目目录:
pwd
再查看 Docker Compose 中实际挂载的路径。
第一步一定要确认:
Codex修改目录和Docker实际使用目录是不是同一个。
二、Volume挂载错误是最常见原因之一
开发环境经常配置:
volumes:
- ./src:/app/src
这意味着宿主机:
./src
会覆盖容器里的:
/app/src
如果实际代码却在:
./frontend/src
那么Codex即使修改正确,容器也看不到。
所以遇到代码不生效时,重点检查:
-
宿主机挂载路径;
-
容器目标路径;
-
相对路径从哪里计算。
三、没有挂载源码时,代码可能已经被写进镜像
另一种项目可能没有直接挂载源码。
Dockerfile里使用:
COPY . /app
这种情况下,代码是在:
构建镜像时复制进去的。
Codex后来修改宿主机文件,不会自动改变已经存在的镜像。
这时候仅仅执行:
docker restart app
通常没有用。
因为重启的仍然是旧镜像。
需要重新构建,例如:
docker compose build
docker compose up -d
四、Build Cache为什么会让人误以为代码没更新?
Docker为了提高构建速度,会复用之前已经构建过的Layer。
例如:
COPY package.json .
RUN npm install
COPY . .
正常情况下,源码变化后最后的 COPY . . 应该重新执行。
但如果 Dockerfile、构建上下文或者 .dockerignore 配置有问题,就可能出现:
你以为新文件进入了镜像,实际上根本没有被复制。
可以尝试:
docker compose build --no-cache
但不要把 --no-cache 当成固定解决办法。
更重要的是确认:
为什么缓存没有按照预期失效。
五、检查.dockerignore
这个文件很容易被忽略。
例如:
src/generated
config
dist
如果 Codex 修改的文件正好被 .dockerignore 排除,那么 Build 时它不会进入镜像。
所以出现:
本地已经改了,重新Build还是旧代码。
可以检查:
.dockerignore
确认目标文件或目录有没有被忽略。
六、WORKDIR不一致也容易看错位置
Dockerfile可能写:
WORKDIR /app
但启动脚本实际进入:
/app/server
或者代码被复制到:
/usr/src/app
如果你进入容器后只检查 /app,可能会误以为文件没更新。
可以进入容器:
docker exec -it <container> sh
然后确认:
pwd
以及:
ls
找到应用真正运行的位置。
七、直接检查容器里的文件最有效
如果不确定问题出在哪,最直接的方法是:
对比宿主机和容器内部文件。
例如宿主机:
cat src/app.ts
然后进入容器:
docker exec -it <container> sh
再查看:
cat /app/src/app.ts
如果两边内容不同,问题基本就可以缩小到:
-
Volume;
-
镜像;
-
Build;
-
工作目录。
而不是继续修改业务代码。
八、什么时候只需要重启,什么时候必须重新Build?
可以简单区分。
使用Volume挂载源码
例如:
volumes:
- ./src:/app/src
通常源码修改后不需要重新Build。
但应用进程如果没有热更新,可能需要:
重启服务或容器。
源码直接COPY进镜像
例如:
COPY . /app
源码发生变化以后通常需要:
重新Build镜像,再启动新容器。
所以不能把:
restart
和:
rebuild
当成同一个操作。
九、一个实用排查顺序
以后遇到 Codex 改完代码,但 Docker 仍然运行旧版本,可以按这个顺序:
第一步:确认Codex修改目录。
是不是当前项目?
第二步:检查Volume。
源码是否正确挂载?
第三步:检查**.dockerignore****。**
目标文件有没有被排除?
第四步:检查Dockerfile。
源码是挂载进去,还是Build时COPY进去?
第五步:进入容器查看真实文件。
确认容器里到底是哪一版代码。
第六步:决定重启还是重新Build。
不要盲目反复执行命令。
十、可以让Codex完成后主动检查Docker状态
以后可以在任务里增加:
修改完成后请确认:
1. 修改的是哪个本地目录;
2. Docker是否通过Volume挂载该目录;
3. 如果源码来自镜像,是否需要重新Build;
4. 检查.dockerignore;
5. 确认容器里的目标文件已经是最新版本;
6. 不要因为代码未生效就直接重复修改业务逻辑。
这样可以减少:
代码其实已经改对,只是容器没有加载新版本
这种重复返工。
最后
Codex在Docker项目里改完代码,容器却还是旧版本,真正需要排查的通常不是代码逻辑,而是:
宿主机 → Volume → Build Context → 镜像 → 容器运行目录
这一整条链路。
最关键的一步是:
直接进入容器确认它真正运行的是哪一份文件。
如果容器内还是旧代码,就先解决Docker同步问题。
不要急着让Codex再修改一次代码,否则很可能:
代码本来已经正确,却因为运行环境没更新,反而越改越复杂。
持续更新 Codex、大模型开发与 AI 编程实战内容,更多技术内容和稳定订阅渠道欢迎搜索关注「仙逆GPT」。
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐



所有评论(0)