挂载本地broker.xml至ActiveMQ Artemis容器遭反向修改及启动失败问题
初始问题
我使用RedHat的ActiveMQ Artemis镜像,通过docker-compose运行容器并尝试挂载本地./artemis/broker.xml替换容器默认配置,docker-compose.yml内容如下:
version: "3" services: artemis: image: quay.io/artemiscloud/activemq-artemis-broker user: "root" environment: AMQ_USER: admin AMQ_PASSWORD: admin AMQ_EXTRA_ARGS: "--relax-jolokia" AMQ_RESET_CONFIG: true volumes: - ./artemis/broker.xml:/home/jboss/broker/etc/broker.xml ports: - "5672:5672" - "61616:61616" - "8161:8161" networks: - backend ... networks: backend: driver: bridge
本地目录结构:
docker-compose.yml artemis/ - broker.xml
我以root用户运行容器,设置了AMQ_RESET_CONFIG: true环境变量。本地broker.xml中<max-disk-usage>值为100,容器默认值为90。执行docker-compose up --build -d后容器成功运行,但本地broker.xml被容器修改,<max-disk-usage>值变为90。
期望容器使用本地的broker.xml,而非容器修改本地文件,请问为何出现此现象?如何实现本地broker.xml替换容器默认配置?
更新报错
尝试将AMQ_RESET_CONFIG设为false,使用相同docker-compose.yml配置启动容器后失败,报错:
2024-06-27 21:19:50 Running Broker 2024-06-27 21:19:50 /opt/amq/bin/launch.sh: line 49: /home/jboss/broker/bin/artemis: No such file or directory
问题原因与解决方法
1. 本地broker.xml被修改的原因
当AMQ_RESET_CONFIG=true时,容器启动脚本会强制重置broker配置:它会读取内置的默认配置模板,同步覆盖挂载到/home/jboss/broker/etc/broker.xml的本地文件参数(比如<max-disk-usage>)。这个环境变量的核心作用就是让配置回归默认状态,所以即使挂载了自定义文件,脚本依然会对其进行修改。
2. 正确挂载自定义broker.xml的步骤
要让容器使用本地配置且不被修改,需要分两步完成初始化与挂载:
(1)先完成broker初始化,生成基础运行文件
直接设置AMQ_RESET_CONFIG=false会报错,是因为首次启动时跳过了初始化流程,/home/jboss/broker目录缺少必要的运行脚本与目录结构。所以需要先启动容器完成初始化:
- 临时修改docker-compose.yml,注释掉broker.xml挂载,保留
AMQ_RESET_CONFIG=true:version: "3" services: artemis: image: quay.io/artemiscloud/activemq-artemis-broker user: "root" environment: AMQ_USER: admin AMQ_PASSWORD: admin AMQ_EXTRA_ARGS: "--relax-jolokia" AMQ_RESET_CONFIG: true # 注释挂载配置 # volumes: # - ./artemis/broker.xml:/home/jboss/broker/etc/broker.xml ports: - "5672:5672" - "61616:61616" - "8161:8161" networks: - backend networks: backend: driver: bridge - 启动容器完成初始化:
docker-compose up -d - 等待容器正常运行后,停止容器:
docker-compose down
(2)复制容器内配置并挂载自定义版本
- 把容器初始化生成的
broker.xml复制到本地目录:docker cp <容器名称或ID>:/home/jboss/broker/etc/broker.xml ./artemis/ - 编辑本地
./artemis/broker.xml,将<max-disk-usage>改为100。 - 恢复docker-compose.yml的挂载配置,同时设置
AMQ_RESET_CONFIG=false:version: "3" services: artemis: image: quay.io/artemiscloud/activemq-artemis-broker user: "root" environment: AMQ_USER: admin AMQ_PASSWORD: admin AMQ_EXTRA_ARGS: "--relax-jolokia" AMQ_RESET_CONFIG: false volumes: - ./artemis/broker.xml:/home/jboss/broker/etc/broker.xml ports: - "5672:5672" - "61616:61616" - "8161:8161" networks: - backend networks: backend: driver: bridge - 重新启动容器:
docker-compose up -d
(3)验证配置生效
进入容器查看配置是否正确:
docker exec -it <容器名称或ID> cat /home/jboss/broker/etc/broker.xml | grep max-disk-usage
确认输出值为100,且本地broker.xml不会再被容器修改。
3. 替代方案:挂载配置模板
如果不想先初始化容器,可以将自定义broker.xml挂载到容器的配置模板目录/opt/amq/etc/,让初始化脚本使用你的模板生成运行配置:
volumes: - ./artemis/broker.xml:/opt/amq/etc/broker.xml
保持AMQ_RESET_CONFIG=true,脚本会基于你提供的模板生成/home/jboss/broker/etc/broker.xml,不会修改本地的模板文件。这种方式适合需要自定义初始配置的场景,但每次启动如果AMQ_RESET_CONFIG=true都会重新生成配置。
内容的提问来源于stack exchange,提问作者user842225

