Docker Compose中自定义axelor-config.properties启动异常问题
我有一个基于tomcat:9.0.70-jdk17-temurin的Dockerfile,其中复制了依赖axelor-config.properties配置的Axelor war包,该配置文件路径为:/usr/local/tomcat/webapps/nameofapp/WEB-INF/classes/axelor-config.properties
直接使用镜像内配置文件时应用可正常运行,但通过Docker Compose的volume映射(./configuration/axelor-config.properties:/usr/local/tomcat/webapps/nameofapp/WEB-INF/classes/axelor-config.properties)覆盖该文件后,应用无法启动。我希望通过覆盖配置文件避免每次修改配置都重新编译应用、构建镜像。经确认配置文件已成功覆盖(容器内可见添加的注释),但启动失败,以下是全新镜像执行docker compose up后的日志:
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 26-Dec-2022 22:51:21.618 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/9.0.70 26-Dec-2022 22:51:21.666 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Dec 1 2022 14:05:47 UTC 26-Dec-2022 22:51:21.667 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.70.0 26-Dec-2022 22:51:21.667 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux 26-Dec-2022 22:51:21.667 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 5.15.0-56-generic 26-Dec-2022 22:51:21.667 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64 26-Dec-2022 22:51:21.668 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /opt/java/openjdk 26-Dec-2022 22:51:21.668 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 17.0.5+8 26-Dec-2022 22:51:21.668 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Eclipse Adoptium 26-Dec-2022 22:51:21.668 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat 26-Dec-2022 22:51:21.668 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat 26-Dec-2022 22:51:21.681 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED 26-Dec-2022 22:51:21.681 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED 26-Dec-2022 22:51:21.681 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED 26-Dec-2022 22:51:21.682 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED 26-Dec-2022 22:51:21.682 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 26-Dec-2022 22:51:21.682 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties 26-Dec-2022 22:51:21.682 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 26-Dec-2022 22:51:21.682 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048 26-Dec-2022 22:51:21.682 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 26-Dec-2022 22:51:21.683 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 26-Dec-2022 22:51:21.683 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs= 26-Dec-2022 22:51:21.683 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat 26-Dec-2022 22:51:21.683 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat 26-Dec-2022 22:51:21.683 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp 26-Dec-2022 22:51:21.688 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.35] using APR version [1.7.0]. 26-Dec-2022 22:51:21.689 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true]. 26-Dec-2022 22:51:21.689 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true] 26-Dec-2022 22:51:21.699 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 3.0.2 15 Mar 2022] 26-Dec-2022 22:51:22.409 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] 26-Dec-2022 22:51:22.484 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [992] milliseconds 26-Dec-2022 22:51:22.578 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 26-Dec-2022 22:51:22.578 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.70] 26-Dec-2022 22:51:22.599 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/nameofapp.war] 26-Dec-2022 22:51:23.097 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/nameofapp.war] has finished in [498] ms 26-Dec-2022 22:51:23.099 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 26-Dec-2022 22:51:23.106 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [622] milliseconds
1. 文件权限不匹配
Docker挂载主机文件到容器时,文件权限可能与Tomcat运行用户(通常为tomcat)不兼容,导致应用无法读取配置。
- 检查容器内文件权限:执行
docker exec <容器ID> ls -l /usr/local/tomcat/webapps/nameofapp/WEB-INF/classes/axelor-config.properties - 修复方法:
- 调整主机文件权限:
chmod 644 ./configuration/axelor-config.properties - 构建镜像时确保
tomcat用户对目标路径有读取权限:RUN chown -R tomcat:tomcat /usr/local/tomcat/webapps/nameofapp
- 调整主机文件权限:
2. WAR包解压时序问题
Tomcat启动时会自动解压WAR包,若挂载操作晚于解压,WAR包内的原配置文件会覆盖挂载的文件(即使后续挂载成功,应用已读取了原配置)。
- 修复方法:在Dockerfile中提前解压WAR包,避免启动时自动覆盖:
RUN mkdir -p /usr/local/tomcat/webapps/nameofapp && \ unzip /usr/local/tomcat/webapps/nameofapp.war -d /usr/local/tomcat/webapps/nameofapp && \ rm /usr/local/tomcat/webapps/nameofapp.war && \ chown -R tomcat:tomcat /usr/local/tomcat/webapps/nameofapp
3. 配置文件编码/格式错误
主机文件编码(如Windows GBK)与容器内预期的UTF-8不匹配,会导致Axelor解析配置失败。
- 检查主机文件编码:
file ./configuration/axelor-config.properties - 转换为UTF-8:使用文本编辑器(如VS Code)将文件编码切换为UTF-8并保存。
4. Axelor配置加载优先级问题
Axelor可能优先读取内置配置或缓存配置,未加载挂载的外部文件。可通过JVM参数指定外部配置路径:
- 修改Docker Compose的环境变量:
services: axelor: # ... 其他配置 ... environment: - JAVA_OPTS=-Daxelor.config=/opt/axelor-config.properties volumes: - ./configuration/axelor-config.properties:/opt/axelor-config.properties
内容的提问来源于stack exchange,提问作者Pablo Arriola

