环境
Docker 19.03.5
PHP-FPM 7.1.33
Deployer 6.8.0
描述
触发 CI Pipeline 后,执行 deployer 进行部署,一切顺利,目录结构如下:
.
├── current -> releases/22 # 当前运行的版本,Nginx 和 PHP 都指向该软链
├── releases
│ ├── 20
│ ├── 21
│ └── 22
└── shared
└── storage
7 directories, 0 files
21 这个文件夹上个发布的版本,22 是最新发布的版本,但是请求项目页面,显示的还是 20 里面的代码逻辑。于是我执行如下命令:
mv 21 temp
此时再去请求项目,则代码加载的是最新的 22 这个目录下的。
一开始考虑到 Docker volume 的缓存问题,所以在宿主机和容器(Nginx 和 PHP-FPM)中都进行 current 软链的信息比对,发现都是一致的,那么也就排除了是因为挂载卷导致的文件系统缓存问题。
然后我手动模拟发版的操作,执行了如下命令:
ln -nfs --relative /usr/wwwroot/internal/releases/21 /usr/wwwroot/internal/release # 创建最新版本的软链接,用于安装依赖
mv -T /usr/wwwroot/internal/release /usr/wwwroot/internal/current # 将安装好的项目软链修改为当前版本
按理来说此时加载的应该是上一版本的代码,但是实际请求发现代码逻辑是 22 那个目录下的。这次我重启了 PHP-FPM 的容器,发现又正常回滚到 21 的代码了。那么问题就存在 PHP-FPM 容器中。
然后按照网上的方法,禁用了 Opcache 以及清理了 realpath_cache,重启 PHP-FPM,再次将 current 软链到 releases/20 这个目录,发现依旧不能生效。
我能想象到的可能产生缓存的地方就这些了,各位有遇到过类似问题的吗?还请赐教,不胜感激!