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
相关产品推荐
相关产品推荐

