You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Docker Compose部署多服务到Azure容器实例?部署报错求助

问题描述

我有一个包含Prometheus、Grafana、Spring Boot微服务及ELK等组件的Docker Compose文件,本地运行正常,但修改后部署到Azure容器实例(ACI)时出现以下两个错误:

service "prometheus" refers to undefined volume fsefileshare: invalid compose project
error looking up volume plugin azure_file: plugin "azure_file" not found

本地运行的Docker Compose示例

version: '3.9'
services:
  setup:
    build:
      context: ./config/setup/
      dockerfile: Dockerfile
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    init: true
    volumes:
      - setup:/state:Z
    environment:
      ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
      LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
      KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
    networks:
      - fse_net

  database_mysql:
      image: mysql:8.0
      restart: always
      volumes:
        - mysql_data:/var/lib/mysql
        - ./fse_auth.sql:/docker-entrypoint-initdb.d/fse_auth.sql:ro
      environment:
        MYSQL_ROOT_PASSWORD: root
        
      networks:
        - fse_net
  #************Mongo DB - 1***************
  database_mongo:
    restart: always
    container_name: database_mongo
    image: mongo:latest
    volumes:
      - mongo_data:/data/db
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    ports:
      - 27017:27017
    networks:
      - fse_net
  #************prometheus***************  
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    depends_on:
      - database_mongo
      - registery
      - company
      - stock
      - gateway
    networks:
      - fse_net
  #************company***************
  company:
    container_name: company
    restart: always
    environment:
      - EUREKA_REGISTERY=registery
      - DATABASE_HOST=database_mongo
    build:
      context: ./company
      dockerfile: Dockerfile
    ports:
      - 8086:8086
    depends_on:
      - database_mongo
      - database_mysql
    networks:
      - fse_net
  #************stock***************
  stock:
    container_name: stock
    environment:
      - EUREKA_REGISTERY=registery
      - DATABASE_HOST=database_mongo
    build:
      context: ./stock
      dockerfile: Dockerfile
    ports:
      - 8081:8081
    depends_on:
      - database_mongo
    networks:
      - fse_net
  
volumes:
  setup:
  mysql_data:
  mongo_data:
  grafana-storage:
  zookeeper_data:
  zookeeper_log:
  kafka_data:
  elasticsearch:
networks:
  fse_net:
    driver: bridge

适配Azure修改后的Docker Compose

version: '3.9'
services:
  setup:
    build:
      context: ./config/setup/
      dockerfile: Dockerfile
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    image: myazureacr.azurecr.io/setup
    init: true
    volumes:
      - setup:/state:Z
    environment:
      ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
      LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
      KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
    networks:
      - fse_net

  database_mysql:
      image: mysql:8.0
      restart: always
      volumes:
        - fse_data:/var/lib/mysql
        - fsefileshare/fse_auth.sql:/docker-entrypoint-initdb.d/fse_auth.sql:ro
      environment:
        MYSQL_ROOT_PASSWORD: root
        
      networks:
        - fse_net

  #************Mongo DB - 1***************
  database_mongo:
    restart: always
    container_name: database_mongo
    image: mongo:latest
    volumes:
      - fse_data:/data/db
      - fsefileshare/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    ports:
      - 27017:27017
    networks:
      - fse_net
  
  #************prometheus***************  
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    # environment:
    #   - APP_GATEWAY=gateway
    #   - REGISTERY_APP=registery
    volumes:
      - fsefileshare/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    depends_on:
      - database_mongo
      - company
      - stock
    networks:
      - fse_net
  
  #************company***************
  company:
    container_name: company
    restart: always
    environment:
      - EUREKA_REGISTERY=registery
      - DATABASE_HOST=database_mongo
    build:
      context: ./company
      dockerfile: Dockerfile
    image: myazureacr.azurecr.io/company
    ports:
      - 8086:8086
    depends_on:
      - database_mongo
      - database_mysql
    networks:
      - fse_net
  #************stock***************
  stock:
    container_name: stock
    environment:
      - EUREKA_REGISTERY=registery
      - DATABASE_HOST=database_mongo
    build:
      context: ./stock
      dockerfile: Dockerfile
    image: myazureacr.azurecr.io/stock
    ports:
      - 8081:8081
    depends_on:
      - database_mongo
   
    networks:
      - fse_net
  
  

volumes:
  fse_data:
    driver: azure_file
    driver_opts:
      share_name: fsefileshare
      storage_account_name: fsestorageaccount
  
networks:
  fse_net:
    driver: bridge

解决方案

1. 修正未定义卷的错误

你在服务中直接使用fsefileshare/xxx的挂载格式,但Docker Compose要求挂载的卷必须在volumes段提前定义。当前配置中只定义了fse_data卷,没有定义fsefileshare,导致报错。

修改方案:在volumes段新增fsefileshare的定义,和fse_data指向同一个Azure文件共享即可:

volumes:
  fse_data:
    driver: azure_file
    driver_opts:
      share_name: fsefileshare
      storage_account_name: fsestorageaccount
  fsefileshare:
    driver: azure_file
    driver_opts:
      share_name: fsefileshare
      storage_account_name: fsestorageaccount

同时,服务中的挂载格式需要调整为卷名:容器内路径,不能直接用卷名/文件名。比如Prometheus的挂载应该修改为:

prometheus:
  # ...其他配置
  volumes:
    - fsefileshare:/etc/prometheus/

前提是你已经把prometheus.yml上传到Azure文件共享的根目录,这样容器内的/etc/prometheus/目录就会同步共享中的文件。

如果需要挂载单个文件,需要先把共享挂载到容器内的临时目录,再映射文件:

prometheus:
  # ...其他配置
  volumes:
    - fsefileshare:/mnt/azure-share
    - /mnt/azure-share/prometheus.yml:/etc/prometheus/prometheus.yml:ro

2. 解决azure_file插件找不到的问题

这个错误是因为本地Docker环境没有安装Azure文件共享插件,但部署到Azure容器实例时,ACI原生支持azure_file驱动,不需要本地插件。你必须使用Azure CLI来部署Compose文件,不能用本地docker compose up命令。

部署命令示例:

az container create --resource-group <你的资源组名称> --file docker-compose.yml

确保Azure CLI已登录,且当前账号有权限访问目标存储账户。

3. 其他关键调整

  • 本地的相对路径挂载(如./fse_auth.sql)在ACI中无法使用,必须全部替换为Azure文件共享挂载。
  • 确保Azure文件共享中已上传所有需要的配置文件:fse_auth.sql、mongo-init.js、prometheus.yml等。
  • setup服务中的setup:/state:Z是本地卷,ACI重启后数据会丢失,建议也替换为Azure文件共享卷。

内容的提问来源于stack exchange,提问作者Shail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:48:29