You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Liferay启动卡住问题求助

Liferay Docker容器启动卡在"Starting Liferay Portal"问题排查

问题背景

首次使用docker-compose部署Liferay 7.2.0-ga1,通过./gradlew buildDockerImage生成docker构建文件,配置了MySQL、3节点Elasticsearch集群、Kibana和Liferay服务,其他容器运行正常,但Liferay容器卡在启动日志阶段,无法正常访问。

配置文件

docker-compose.yml

version: '3.8'
services:
  mysql:
    container_name: mysql
    image: mysql:${MYSQL_VERSION}
    deploy:
      resources:
        limits:
          memory: 1G
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - ${MYSQL_PORT}:3306
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - mysqldata:/var/lib/mysql
      - ./scripts/data.sql:/docker-entrypoint-initdb.d/data.sql
    networks:
      - lfnet
    restart: unless-stopped

  es01:
    container_name: es1
    depends_on:
      - mysql
    image: docker.elastic.co/elasticsearch/elasticsearch:${ES_STACK_VERSION}
    deploy:
      resources:
        limits:
          memory: 1G
    networks:
      - lfnet
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - bootstrap.system_call_filter=false
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - ES_SKIP_SET_KERNEL_PARAMETERS=true
      - discovery.zen.ping.unicast.hosts=es2,es3
      - discovery.zen.minimum_master_nodes=2
      - xpack.security.enabled=false
      - xpack.watcher.enabled=false
      - xpack.monitoring.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es02:
    container_name: es2
    depends_on:
      - es01
    image: docker.elastic.co/elasticsearch/elasticsearch:${ES_STACK_VERSION}
    deploy:
      resources:
        limits:
          memory: 1G
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - lfnet
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      - bootstrap.system_call_filter=false
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - ES_SKIP_SET_KERNEL_PARAMETERS=true
      - discovery.zen.ping.unicast.hosts=es1,es3
      - discovery.zen.minimum_master_nodes=2
      - xpack.security.enabled=false
      - xpack.watcher.enabled=false
      - xpack.monitoring.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es03:
    container_name: es3
    depends_on:
      - es02
    image: docker.elastic.co/elasticsearch/elasticsearch:${ES_STACK_VERSION}
    deploy:
      resources:
        limits:
          memory: 1G
    networks:
      - lfnet
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata03:/usr/share/elasticsearch/data
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      - bootstrap.system_call_filter=false
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - ES_SKIP_SET_KERNEL_PARAMETERS=true
      - discovery.zen.ping.unicast.hosts=es1,es2
      - discovery.zen.minimum_master_nodes=2
      - xpack.security.enabled=false
      - xpack.watcher.enabled=false
      - xpack.monitoring.enabled=false
    ulimits:
      memlock:
        soft: -1
        hard: -1

  kibana:
    container_name: kibana
    depends_on:
      - es01
      - es02
      - es03
    image: docker.elastic.co/kibana/kibana:${ES_STACK_VERSION}
    deploy:
      resources:
        limits:
          memory: 1G
    networks:
      - lfnet
    volumes:
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_URL=http://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}

  liferay:
    container_name: liferay
    deploy:
      resources:
        limits:
          memory: 1G
    build:
      context: ../build/docker
      dockerfile: ../../docker/Dockerfile
    depends_on:
      - es01
      - es02
      - es03
      - mysql
    environment:
      LIFERAY_RETRY_PERIOD_JDBC_PERIOD_ON_PERIOD_STARTUP_PERIOD_DELAY: 10
      LIFERAY_RETRY_PERIOD_JDBC_PERIOD_ON_PERIOD_STARTUP_PERIOD_MAX_PERIOD_RETRIES: 10
      LIFERAY_JVM_OPTS: "-Xms512m -Xmx512m"
    ports:
      - ${LF_PORT}:8080
      - ${LF_GOGO_PORT}:11311
    networks:
      - lfnet

# Volumes
volumes:
  liferay-data:
  liferay-osgi-configs:
  liferay-osgi-marketplace:
  liferay-osgi-modules:
  liferay-osgi-war:

  certs:
    driver: local
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local
  mysqldata:
    driver: local

# Networks
networks:
  lfnet:
    driver: bridge

Liferay Dockerfile

FROM liferay/portal:7.2.0-ga1
ENV LIFERAY_WORKSPACE_ENVIRONMENT=dev
COPY --chown=liferay:liferay deploy /mnt/liferay/deploy
COPY --chown=liferay:liferay patching /mnt/liferay/patching
COPY --chown=liferay:liferay scripts /mnt/liferay/scripts
COPY --chown=liferay:liferay configs /home/liferay/configs
COPY --chown=liferay:liferay 100_liferay_image_setup.sh /usr/local/liferay/scripts/pre-configure/100_liferay_image_setup.sh

Liferay容器卡住的日志信息

[LIFERAY] To SSH into this container, run: "docker exec -it 255c0c98fb63 /bin/bash".

[LIFERAY] Executing scripts in /usr/local/liferay/scripts/pre-configure:

[LIFERAY] Executing 100_liferay_image_setup.sh.
[LIFERAY] Copying /home/liferay/configs/local config files:

/home/liferay/configs/local
└── portal-ext.properties

[LIFERAY] ... into /opt/liferay.

[LIFERAY] The directory /mnt/liferay/files does not exist. Create the directory $(pwd)/xyz123/files on the host operating system to create the directory /mnt/liferay/files on the container. Files in /mnt/liferay/files will be copied to /opt/liferay before Liferay Portal starts.

[LIFERAY] Executing scripts in /mnt/liferay/scripts:

[LIFERAY] The directory /mnt/liferay/deploy is ready. Copy files to $(pwd)/xyz123/deploy on the host operating system to deploy modules to Liferay Portal at runtime.

[LIFERAY] Starting Liferay Portal. To stop the container with CTRL-C, run this container with the option "-it".

排查建议

  • 调整内存配置:Liferay 7.2启动需要足够内存支撑模块加载,当前容器内存限制1G、JVM堆512M偏低。建议将LIFERAY_JVM_OPTS调整为"-Xms1g -Xmx1g",容器内存限制调高到至少2G。
  • 检查Elasticsearch集群状态:进入任意ES容器执行curl http://localhost:9200/_cluster/health,确认集群状态为green或yellow。若集群未正常形成主节点,Liferay会因依赖ES卡住。
  • 验证数据库连接配置:检查portal-ext.properties中的MySQL连接参数是否正确,确保jdbc.default.url、jdbc.default.username、jdbc.default.password指向部署的MySQL服务,否则Liferay无法初始化数据库导致启动停滞。
  • 确保后端服务就绪:depends_on仅保证容器启动顺序,不保证服务可用。可在Liferay启动脚本中添加等待逻辑,或使用工具检测MySQL(3306端口)和ES(9200端口)服务就绪后再启动Liferay。
  • 查看详细启动日志:进入Liferay容器,执行docker exec -it liferay tail -f /opt/liferay/tomcat/logs/catalina.out或docker exec -it liferay tail -f /opt/liferay/logs/liferay.log,获取更详细的报错信息,定位具体卡启动的原因。

内容的提问来源于stack exchange,提问作者Alfa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:06:56