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,系统无法找到这个文件。
解决办法
转换脚本换行符为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/*修改ENTRYPOINT执行方式
调整Dockerfile中的ENTRYPOINT指令,避免换行符解析问题:ENTRYPOINT ["bash", "-c", "./entrypoint.sh"]额外优化:使用官方默认用户
官方SQL Server镜像默认使用mssql用户运行,在Dockerfile末尾添加USER mssql(需放在复制脚本、设置权限之后),提升容器安全性:USER mssql
内容的提问来源于stack exchange,提问作者Mitrajeet Golsangi
相关产品推荐
相关产品推荐

