如何挂载本地login.config覆盖ActiveMQ Artemis容器默认文件?
问题描述
我使用的镜像为quay.io/artemiscloud/activemq-artemis-broker,在docker-compose.yml中以root用户运行容器。挂载本地文件作为容器内新文件(如/home/jboss/broker/etc/my.json)可以正常工作,但挂载本地文件覆盖容器内已有的/home/jboss/broker/etc/login.config时失败,报错:
2024-03-04 22:30:59 Exception in thread "main" java.io.FileNotFoundException: broker/etc/login.config (Permission denied)
已确认容器内默认存在/home/jboss/broker/etc/目录,且该路径下有login.config文件:
[jboss@5905b996368e ~]$ pwd /home/jboss [jboss@5905b996368e ~]$ ls broker [jboss@5905b996368e ~]$ ls ./broker/etc/ ... login.config ...
请问如何将主机上的本地文件./config/login.config挂载到容器路径/home/jboss/broker/etc/login.config以实现覆盖?
解决方案
1. 调整本地文件的权限与所有者
容器内的ActiveMQ Artemis实际是以jboss用户运行程序,即使指定user: root启动容器,程序启动后会自动切换到jboss用户。挂载的本地文件权限配置不当会导致jboss用户无法读取。
- 查询容器内jboss用户的UID:
docker exec -it <容器ID或名称> id jboss # 示例输出:uid=1001(jboss) gid=1001(jboss) groups=1001(jboss)
- 修改主机上
login.config的所有者与权限:
chown 1001:1001 ./config/login.config chmod 644 ./config/login.config
2. 启动时自动调整容器内文件权限
若不想修改主机文件权限,可在docker-compose.yml中添加启动命令,先调整挂载文件的权限再启动服务:
version: "3" services: artemis: user: "root" image: quay.io/artemiscloud/activemq-artemis-broker environment: AMQ_USER: admin AMQ_PASSWORD: password AMQ_RESET_CONFIG: true volumes: - ./config/my.json:/home/jboss/broker/etc/my.json - ./config/login.config:/home/jboss/broker/etc/login.config ports: - "5672:5672" - "61616:61616" - "8161:8161" networks: - backend command: ["sh", "-c", "chown jboss:jboss /home/jboss/broker/etc/login.config && exec /opt/amq/bin/run.sh"] networks: backend: driver: bridge
3. 切换为目录挂载
将本地config目录完整挂载到容器的/home/jboss/broker/etc目录,这种方式可避免单个文件挂载的权限冲突:
volumes: - ./config/:/home/jboss/broker/etc/
注意:此操作会覆盖容器内etc目录下的所有原有文件,请确保本地config目录包含所有必需的配置文件。
内容的提问来源于stack exchange,提问作者user842225
相关产品推荐
相关产品推荐

