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

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
    
  • 如果是先启动容器执行脚本、再挂载数据卷,数据库文件会保存在容器内部而非本地目录,容器删除后数据丢失。解决方式:
    1. 停止并清理容器:docker-compose down -v
    2. 确保./sqlVolumn目录为空且权限正确
    3. 重新启动容器,再执行初始化脚本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:20:58