Docker Compose部署mosquitto-go-auth插件加载失败求助
问题分析与解决方案
问题根源
你遇到的插件加载错误并非缺少Golang环境,而是C库不兼容:
- 官方
eclipse-mosquitto:2.0.18镜像基于Alpine Linux,使用轻量的muslC库 - 你在Ubuntu(使用
glibc)编译的go-auth.so依赖glibc的特定符号(如__fprintf_chk),musl库没有实现该符号,导致插件加载失败
完整部署配置
1. 项目结构
./ ├── docker-compose.yml ├── .env ├── postgres-data/ ├── mosquitto/ │ ├── Dockerfile # 自定义mosquitto镜像构建文件 │ ├── config/ │ │ └── mosquitto.conf │ ├── log/ # 手动创建,确保权限为mosquitto用户可写 │ └── init-mqtt-auth-db.sh └── pgadmin-data/
2. 自定义Mosquitto镜像Dockerfile
创建./mosquitto/Dockerfile,使用Debian基础镜像(与Ubuntu的glibc兼容),并在容器内编译mosquitto-go-auth:
# 使用Debian版mosquitto镜像,保证glibc兼容 FROM eclipse-mosquitto:2.0.18-debian # 安装编译依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ golang gcc libc-dev git \ && rm -rf /var/lib/apt/lists/* # 克隆并编译mosquitto-go-auth WORKDIR /tmp RUN git clone https://github.com/iegomez/mosquitto-go-auth.git \ && cd mosquitto-go-auth \ && make # 将编译好的插件复制到mosquitto配置目录 RUN cp /tmp/mosquitto-go-auth/go-auth.so /mosquitto/config/ # 切换回mosquitto用户,保证权限安全 USER mosquitto
3. 修改docker-compose.yml
调整mqtt服务配置,使用自定义镜像、修复网络连通性、添加健康检查依赖:
version: "3.9" services: postgres: container_name: postgres_container image: postgres:14.8-alpine3.18 command: - "postgres" - "-c" - "max_connections=50" - "-c" - "shared_buffers=1GB" - "-c" - "effective_cache_size=4GB" - "-c" - "work_mem=16MB" - "-c" - "maintenance_work_mem=512MB" - "-c" - "random_page_cost=1.1" - "-c" - "temp_file_limit=10GB" - "-c" - "log_min_duration_statement=200ms" - "-c" - "idle_in_transaction_session_timeout=10s" - "-c" - "lock_timeout=1s" - "-c" - "statement_timeout=60s" - "-c" - "shared_preload_libraries=pg_stat_statements" - "-c" - "pg_stat_statements.max=10000" - "-c" - "pg_stat_statements.track=all" environment: POSTGRES_DB: ${DATABASE_NAME} POSTGRES_USER: ${DATABASE_USER} POSTGRES_PASSWORD: ${DATABASE_PASSWORD} PGDATA: "/var/lib/postgresql/data/pgdata" volumes: - ./postgres-data:/var/lib/postgresql/data - ../2. Init Database:/docker-entrypoint-initdb.d - ./mosquitto/init-mqtt-auth-db.sh:/docker-entrypoint-initdb.d/init-mqtt-auth-db.sh ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DATABASE_USER} -d ${DATABASE_NAME}"] interval: 10s timeout: 5s retries: 5 start_period: 10s restart: unless-stopped deploy: resources: limits: cpus: '1' memory: 4G networks: - postgres pgadmin: container_name: pgadmin_container image: dpage/pgadmin4:7.2 environment: PGADMIN_DEFAULT_EMAIL: ${PG_DEFAULT_EMAIL} PGADMIN_DEFAULT_PASSWORD: ${PG_DEFAULT_ADMIN_PASSWORD} PGADMIN_CONFIG_SERVER_MODE: "False" volumes: - pgadmin-data:/var/lib/pgadmin ports: - "5050:80" restart: unless-stopped deploy: resources: limits: cpus: '0.5' memory: 1G networks: - postgres mqtt-broker: # 使用自定义构建的镜像 build: ./mosquitto user: mosquitto volumes: - ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf # 挂载日志目录而非文件,避免权限冲突 - ./mosquitto/log:/mosquitto/log - data:/mosquitto/data ports: - target: 1883 published: 1883 protocol: tcp mode: host - target: 9001 published: 9001 protocol: tcp mode: host networks: - postgres # 加入postgres网络,确保能连接数据库 - mqtt-net # 等待postgres健康检查通过后再启动 depends_on: postgres: condition: service_healthy volumes: postgres-data: pgadmin-data: data: name: "mqtt-broker-data" networks: postgres: driver: bridge mqtt-net: driver: bridge ipam: driver: default config: - subnet: 172.100.10.0/24
4. 调整mosquitto.conf
修正容器内路径配置,确保与挂载目录匹配:
persistence true # 改为容器内的data目录,与volume挂载对应 persistence_location /mosquitto/data/ # log info: log_dest file /mosquitto/log/mosquitto.log # auth: allow_anonymous false listener 1883 # 使用容器内编译好的插件路径 auth_plugin /mosquitto/config/go-auth.so auth_opt_log_level debug require_certificate false # postgress options: auth_opt_backends postgres auth_opt_pg_host postgres auth_opt_pg_port 5432 auth_opt_pg_dbname API auth_opt_pg_user mqtt_user auth_opt_pg_password mqtt_pass # hash options: auth_opt_pg_hasher bcrypt auth_opt_pg_hasher_salt_size 16 # salt bytes length # ssl auth_opt_pg_sslmode disable # auth options auth_opt_pg_connect_tries 5 auth_opt_pg_userquery select password from MqttUser where login = $1 limit 1 auth_opt_pg_superquery select count(*) from test_user where username = $1 and is_admin = true
部署步骤
- 确保
./mosquitto/log目录存在,执行chown 1883:1883 ./mosquitto/log(mosquitto容器用户UID为1883) - 配置
.env文件,确保DATABASE_NAME=API、DATABASE_USER=mqtt_user、DATABASE_PASSWORD=mqtt_pass与mosquitto.conf一致 - 执行
docker-compose build构建自定义mosquitto镜像 - 执行
docker-compose up -d启动服务
内容的提问来源于stack exchange,提问作者FroggerProgger
相关产品推荐
相关产品推荐

