You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将Azure文件共享中的指定文件挂载至容器?——Docker Compose部署cbioportal数据库场景

我来帮你搞定这个问题——把Azure文件共享里的SQL脚本正确挂载到MySQL容器,让它能顺利完成数据库初始化、架构搭建和数据填充。

首先得明确一个核心限制:Azure文件共享的卷挂载只支持整个目录挂载,不能像本地文件系统那样直接挂载单个文件。你之前尝试直接挂载cbioportal_data/data/cgds.sql到容器内的单个文件路径,这就是配置失效的关键原因。

可行方案:挂载整个初始化脚本目录

我们可以通过调整文件结构和Compose配置,利用MySQL官方镜像的自动初始化逻辑来实现需求:

1. 整理Azure文件共享的结构

在你的cbioportal-file-share文件共享中,创建一个名为init-scripts的子目录,把cgds.sqlseed.sql.gz上传到这个目录下。最终共享的结构应该是:

cbioportal-file-share/
├── init-scripts/
│   ├── cgds.sql
│   └── seed.sql.gz
└── mysql/  # 用于存储MySQL持久化数据的目录

2. 修改Docker Compose配置

更新你的Compose文件,将整个init-scripts目录挂载到容器的/docker-entrypoint-initdb.d目录(MySQL官方镜像会自动扫描并执行该目录下的所有SQL/压缩SQL文件):

services:
  # 其他服务已省略
  cbioportal-database:
    restart: unless-stopped
    image: mysql:5.7
    container_name: cbioportal-database-container
    environment:
      MYSQL_DATABASE: cbioportal
      MYSQL_USER: cbio_user
      MYSQL_PASSWORD: somepassword
      MYSQL_ROOT_PASSWORD: somepassword
    volumes:
      # 挂载Azure文件共享的mysql目录,存储数据库持久化数据
      - cbioportal_data/mysql:/var/lib/mysql
      # 挂载整个init-scripts目录到容器的初始化脚本目录,只读权限
      - cbioportal_data/init-scripts:/docker-entrypoint-initdb.d:ro
volumes:
  cbioportal_data:
    driver: azure_file
    driver_opts:
      share_name: cbioportal-file-share
      storage_account_name: cbioportalstorage

3. 验证并修复权限问题(重要)

Azure文件共享的默认权限可能导致容器内的mysql用户(UID 999)无法读取脚本文件,你可以通过以下方式排查和解决:

  • 进入容器查看目录权限:
    docker exec -it cbioportal-database-container ls -l /docker-entrypoint-initdb.d
    
  • 如果权限不对,优先在Azure门户中调整文件共享的权限,或在上传文件时设置chmod 644。临时解决方案可以在Compose中添加命令调整权限:
    services:
      cbioportal-database:
        # 其他配置不变
        command: ["sh", "-c", "chmod 644 /docker-entrypoint-initdb.d/* && docker-entrypoint.sh mysqld"]
    

额外注意事项

  • 初始化脚本只会在容器首次启动且数据库未初始化时执行。如果需要重新初始化,要先删除Azure文件共享里mysql目录下的所有数据,再重启容器。
  • 确保Azure文件共享的mysql目录是空的或未初始化过,否则MySQL会跳过初始化脚本的执行。

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

火山引擎 最新活动