如何用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
相关产品推荐
相关产品推荐

