电脑必备
部署包里的空目录老丢,我查了半天是打包工具默认跳过
78 0 13
上周发版,一个 Java 服务起不来,报错说日志目录不存在。我本地跑得好好的,一查部署包,logs/ 这个空目录没了。
先说环境:CentOS 7.9,JDK 11.0.15,打包用 Maven assembly 3.3.0,解压是运维那边直接 tar -xzf。
排查过程列一下:
- 先看 Maven 打包日志,没报错,assembly 配置里目录结构写得没问题。
- 解开 tar 包对比,
bin/、conf/都在,就logs/和data/两个空目录没打进去。 - 翻 assembly 文档,发现默认
includeEmptyDirectories是 false。得,改成 true,重新打包,tar -tzf能看到空目录了。
本来以为完事了,结果运维那边又出幺蛾子。他们用 tar -xzf 解压到目标目录,空目录是出来了,但权限是 755,属主是 root。logs/ 目录应用用户跑起来没权限写,启动又失败。
最后在打包脚本里加了一步,解压后 chown -R app:app logs data,才彻底消停。
几个实测数据:
- Maven assembly 3.3.0 默认
includeEmptyDirectories=false,3.4.0 我没测,不确定改了没。 - tar 解压空目录权限跟包里记录的一致,打包时
tar -cf的权限是啥就是啥,别指望解压时自动变。 - 我拿三台机子跑了这版包(CentOS 7.9 两台,Ubuntu 20.04 一台),空目录问题一致,权限问题只在 root 解压时出现。
另外提醒一句:如果用的是 tar 打包,--exclude 写不好容易把空目录连带父目录一起干掉了。我同事之前写 --exclude='logs/*',结果 logs/ 整个没了。要排除内容不排除目录,得写成 --exclude='logs/*' 但保留父目录,或者干脆打包前用 find 把空目录列出来,用 tar -T 指定。
你们的部署包是怎么处理的?有没有遇到过空目录丢或者权限不对的情况?你们是打包侧解决还是解压侧写脚本兜底?
登录后可以为帖子点赞,但本帖内容对所有人开放阅读。
