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

Docker容器中无法找到SQL Server的sqlservr二进制文件问题求助

自定义SQL Server Docker镜像启动异常:找不到sqlservr二进制文件

问题背景

我正在构建自定义SQL Server镜像,需要在应用连接前执行初始化脚本与数据迁移,配置后遇到异常:entrypoint.sh文件无法找到sqlservr二进制文件。

Dockerfile内容

FROM mcr.microsoft.com/mssql/server:2022-latest

USER root
WORKDIR /usr/src/app

# 复制初始化与迁移脚本
COPY . .

# 设置SQL Server容器环境变量
ENV ACCEPT_EULA=Y
ENV MSSQL_SA_PASSWORD=testPass#1234
ENV MSSQL_PID=Developer

# 暴露数据库端口
EXPOSE 1433

# 赋予脚本执行权限
RUN chmod +x ./entrypoint.sh 
RUN chmod +x ./migrations.sh
RUN chmod +x /opt/mssql/bin/sqlservr

# 设置容器启动入口
ENTRYPOINT ["/bin/bash", "./entrypoint.sh"]

entrypoint.sh内容

echo "********************************* Started SQL Server Image *********************************"
/opt/mssql/bin/sqlservr

运行报错输出

[+] Building 0.2s (11/11) FINISHED                                                                                                                                           docker:default
 => [internal] load .dockerignore                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                        0.0s
 => [internal] load build definition from Dockerfile                                                                                                                                   0.0s
 => => transferring dockerfile: 618B                                                                                                                                                   0.0s
 => [internal] load metadata for mcr.microsoft.com/mssql/server:2022-latest                                                                                                            0.0s
 => [1/6] FROM mcr.microsoft.com/mssql/server:2022-latest                                                                                                                              0.0s
 => [internal] load build context                                                                                                                                                      0.0s
 => => transferring context: 97B                                                                                                                                                       0.0s
 => CACHED [2/6] WORKDIR /usr/src/app                                                                                                                                                  0.0s
 => CACHED [3/6] COPY . .                                                                                                                                                              0.0s
 => CACHED [4/6] RUN chmod +x ./entrypoint.sh                                                                                                                                          0.0s
 => CACHED [5/6] RUN chmod +x ./migrations.sh                                                                                                                                          0.0s
 => CACHED [6/6] RUN chmod +x /opt/mssql/bin/sqlservr                                                                                                                                  0.0s
 => exporting to image                                                                                                                                                                 0.0s
 => => exporting layers                                                                                                                                                                0.0s
 => => writing image sha256:a9ff35832dec4ba79f8ca2d36580ddef2d13d221f646068eaa896dc2d165b921                                                                                           0.0s
 => => naming to docker.io/library/todo-db                                                                                                                                             0.0s
database-test
********************************* Started SQL Server Image *********************************
: No such file or directorypt/mssql/bin/sqlservr

问题原因与解决办法

原因分析

从报错信息No such file or directorypt/mssql/bin/sqlservr可以看出,路径显示异常,这是因为entrypoint.sh文件使用了Windows换行符(CRLF)。Linux环境下会把CR字符解析成路径的一部分,导致实际执行的是/opt/mssql/bin/sqlservr\r,系统无法找到这个文件。

解决办法

  1. 转换脚本换行符为Linux格式(LF)
    可以通过文本编辑器(如VS Code右下角切换换行符为LF)手动修改,或者在Dockerfile中添加dos2unix工具处理脚本:

    RUN apt-get update && apt-get install -y dos2unix \
        && dos2unix ./entrypoint.sh ./migrations.sh \
        && apt-get clean && rm -rf /var/lib/apt/lists/*
    
  2. 修改ENTRYPOINT执行方式
    调整Dockerfile中的ENTRYPOINT指令,避免换行符解析问题:

    ENTRYPOINT ["bash", "-c", "./entrypoint.sh"]
    
  3. 额外优化:使用官方默认用户
    官方SQL Server镜像默认使用mssql用户运行,在Dockerfile末尾添加USER mssql(需放在复制脚本、设置权限之后),提升容器安全性:

    USER mssql
    

内容的提问来源于stack exchange,提问作者Mitrajeet Golsangi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:34:53