如何在Docker Compose YML文件中附加现有MSSQL数据库?
如何在Docker Compose中为MSSQL容器附加已有数据库
步骤1:准备数据库文件
把已有数据库的.mdf(数据文件)和.ldf(日志文件)复制到宿主机指定目录,比如C:\Temp\SqlVolume\attach。
步骤2:修改Docker Compose配置
在db服务中添加卷映射挂载数据库文件,同时增加启动命令执行附加操作。修改后的完整db服务配置如下:
db: image: "mcr.microsoft.com/mssql/server:2019-latest" user: root ports: - "14330:1433" environment: MSSQL_SA_PASSWORD: "SqlPassw0rd!" ACCEPT_EULA: "Y" volumes: - C:\Temp\SqlVolume\data:/var/opt/mssql/data - C:\Temp\SqlVolume\log:/var/opt/mssql/log - C:\Temp\SqlVolume\secrets:/var/opt/mssql/secrets # 新增挂载存放已有数据库文件的目录 - C:\Temp\SqlVolume\attach:/var/opt/mssql/attach # 启动时执行附加数据库的命令 command: > /bin/bash -c " /opt/mssql/bin/sqlservr & sleep 30s && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'SqlPassw0rd!' -Q ' -- 附加用户库 CREATE DATABASE LevSundtUsers ON (FILENAME = ''/var/opt/mssql/attach/LevSundtUsers.mdf''), (FILENAME = ''/var/opt/mssql/attach/LevSundtUsers.ldf'') FOR ATTACH; -- 附加业务库 CREATE DATABASE LevSundtDomain ON (FILENAME = ''/var/opt/mssql/attach/LevSundtDomain.mdf''), (FILENAME = ''/var/opt/mssql/attach/LevSundtDomain.ldf'') FOR ATTACH; ' && wait " container_name: sql2019 hostname: sql1
关键说明
- 卷映射:新增的
C:\Temp\SqlVolume\attach:/var/opt/mssql/attach让容器能访问宿主机上的已有数据库文件。 - 启动命令:先启动SQL Server服务,等待30秒确保服务就绪后,用
sqlcmd执行附加数据库的SQL语句。如果只需附加单个数据库,删除多余的CREATE DATABASE块即可,同时替换语句中的文件名与你实际的数据库文件一致。 - 权限检查:因使用
user: root,容器对挂载目录的读写权限通常足够;若出现文件访问错误,可调整宿主机目录权限。
验证操作
- 停止并清理现有容器:
docker-compose down - 将数据库文件放入
C:\Temp\SqlVolume\attach目录 - 重新启动容器:
docker-compose up -d - 用SSMS连接
localhost:14330(SA账号密码为SqlPassw0rd!),查看数据库列表确认是否附加成功。
注意事项
- 确保已有数据库版本不高于容器使用的SQL Server 2019版本,避免版本兼容问题。
sleep 30s的等待时间可根据实际启动速度调整,确保服务完全就绪后再执行附加命令。
内容的提问来源于stack exchange,提问作者bite_Over3ide
相关产品推荐
相关产品推荐

