Docker启动liferay/portal镜像报错 进程被杀8080端口无限加载
Liferay Docker容器启动被Killed、页面无限加载问题排查方案
首先明确报错核心特征:/usr/local/bin/liferay_entrypoint.sh: line 41: 8 Killed start_liferay.sh是Linux系统OOM Killer(内存不足回收机制)强制杀死进程的标准输出,不是entrypoint脚本本身有语法错误——进程因为内存占用触达阈值被强杀,服务没有完成完整启动流程,才会导致访问8080端口时页面无限加载。
按以下顺序排查解决:
- 先确认内存限制的实际生效逻辑
你虽然在启动命令里加了-m 10g参数,但这个参数的生效前提是Docker服务本身能拿到这么多内存。如果是在Windows、macOS上用Docker Desktop运行,默认全局只给Docker分配2GB运行内存,你在run命令里写再大的-m参数都没用,实际容器可用内存还是受全局配置限制。
排查方式:容器启动卡住时,新开终端执行docker stats查看对应Liferay容器的实时内存占用,看内存占用涨到固定值后就掉0、进程退出,就是撞到内存阈值被杀了。如果是桌面端Docker,先去Docker Desktop的设置-Resources页面,把分配给Docker的总内存调到12G以上保存重启Docker再试。 - 手动指定JVM启动参数适配启动峰值
Liferay 7.4 GA22首次启动时需要完成内置数据库表初始化、OSGi模块部署、搜索索引预热,峰值内存占用远高于日常运行状态,镜像内置的默认JVM参数经常无法覆盖首次启动的内存需求。启动时手动传入JVM参数避免内存溢出:docker run -it -m 12g -p 8080:8080 \ -e JAVA_OPTS="-Xms4g -Xmx8g -XX:MaxMetaspaceSize=1g -XX:+UseG1GC" \ liferay/portal:7.4.3.22-ga22 - 不要提前访问页面,等启动完全完成
Liferay首次启动耗时很长,根据机器性能不同通常需要5~15分钟,启动过程中访问8080端口就会出现无限加载的情况。等控制台输出Server startup in [xxxx] milliseconds的明确启动成功日志后,再访问localhost:8080即可。 - 排查端口冲突
启动前先在宿主机执行对应命令确认8080端口没有被其他服务占用:- Linux/macOS执行:
lsof -i:8080 - Windows执行:
netstat -ano | findstr 8080
如果有其他进程占用8080端口,要么停掉占用进程,要么把docker run的端口映射改成其他端口比如-p 8081:8080,通过8081端口访问。
- Linux/macOS执行:
- 仍无法解决时导出完整日志定位
如果以上操作后进程还是被Killed,启动时把全量日志导出到本地文件,查看进程被杀前的具体报错:
重点看日志里Killed字段出现前有没有docker run -it -m 12g -p 8080:8080 \ -e JAVA_OPTS="-Xms4g -Xmx8g -XX:MaxMetaspaceSize=1g" \ liferay/portal:7.4.3.22-ga22 2>&1 | tee liferay_start.logjava.lang.OutOfMemoryError相关报错,确认是堆内存不足、元空间不足还是其他资源限制导致的进程被杀,对应调大相关资源配额即可。
常见踩坑提示:绝大多数桌面端Docker运行该镜像出现的Killed问题,都是只给run命令加了-m参数,没有修改Docker Desktop全局内存配额导致的,实际容器可用内存远达不到Liferay 7.4的启动最低要求。
内容的提问来源于stack exchange,提问作者Thiago Mussolini
相关产品推荐
相关产品推荐

