Docker部署SQL Server:退出sqlcmd后数据无法持久化求助
问题:Docker中SQL Server执行脚本插入数据后,重新查询数据为空
我在Docker中运行SQL Server镜像,通过sqlcmd执行指定.sql文件后,数据已成功插入表中,但重新登录sqlcmd查询时,表内数据为空。附上相关配置文件,请求排查原因。
相关配置文件
docker-compose.yaml
version: '3' services: # /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P $MSSQL_SA_PASSWORD -C -i /setup/dbSetup.sql sql-server: container_name: sql-server-2022 image: mcr.microsoft.com/mssql/server:2022-latest ports: - 1433:1433 environment: - ACCEPT_EULA=Y - MSSQL_SA_PASSWORD=Root!234 volumes: - ./sqlVolumn:/var/opt/mssql - ./dbSetup.sql:/setup/dbSetup.sql - ./dbConnectionStr.sql:/setup/dbConnectionStr.sql
dbSetup.sql
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = 'FlashCardsDB') BEGIN CREATE DATABASE [FlashCardsDB] END GO USE [FlashCardsDB] GO -- IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='TableName' and xtype='U') DROP TABLE IF EXISTS FlashCards; CREATE TABLE FlashCards ( cardId UNIQUEIDENTIFIER NOT NULL, -- GUID question VARCHAR(255) DEFAULT NULL, answer VARCHAR(255) DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, PRIMARY KEY (cardId) ); GO INSERT INTO FlashCards(cardId, question, answer, status) VALUES ('3fa85f64-5717-4562-b3fc-2c963f66afa6', 'What is smallest prime number', '2', 'pass'); INSERT INTO FlashCards(cardId, question, answer, status) VALUES ('b736b3f4-dadd-4c71-82d1-37774e733fc8', 'How many hours in a day', '24', 'fail'); INSERT INTO FlashCards(cardId, question, answer, status) VALUES ('e844faab-32bc-4f9b-9332-b1123a9652f4', 'What is the first month in a year', 'January', 'pass'); GO SELECT Name from sys.databases; GO SELECT cardId, question, answer, status FROM FlashCards; GO
排查及解决步骤
1. 确认查询时使用了正确的数据库
默认登录sqlcmd会进入master数据库,需切换到FlashCardsDB再查询:
USE [FlashCardsDB]; GO SELECT cardId, question, answer, status FROM FlashCards; GO
或者登录时直接指定目标数据库:
/opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P Root!234 -C -d FlashCardsDB
2. 检查数据卷挂载权限与同步问题
配置中挂载了./sqlVolumn:/var/opt/mssql,如果本地目录权限不足,SQL Server无法持久化数据,容器重启后数据会丢失:
- 修正本地目录权限:
sudo chown -R 10001:10001 ./sqlVolumn - 如果是先启动容器执行脚本、再挂载数据卷,数据库文件会保存在容器内部而非本地目录,容器删除后数据丢失。解决方式:
- 停止并清理容器:
docker-compose down -v - 确保
./sqlVolumn目录为空且权限正确 - 重新启动容器,再执行初始化脚本
- 停止并清理容器:
3. 验证脚本执行完整性
重新执行脚本并检查输出,确认没有报错且插入的数据被正确返回:
/opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P Root!234 -C -i /setup/dbSetup.sql
如果输出中没有显示插入的3条数据,说明脚本执行过程中出现了未捕获的错误。
4. 检查大小写敏感性
Linux环境下的SQL Server默认区分大小写(取决于数据库排序规则),确保查询时的表名FlashCards与脚本中的定义完全一致,避免因大小写不匹配导致查不到数据。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

