Docker run命令与Docker image的区别及SQL Server连接问题排查
Docker Run 与自定义镜像启动SQL Server的差异及连接问题解决
首先明确:Docker Run是直接调用官方预配置镜像的完整启动流程,而自定义镜像如果修改了官方镜像的核心配置或启动逻辑,很容易破坏服务初始化步骤,导致连接失败。你的问题出在两个关键配置错误:
1. 错误设置HOSTNAME环境变量
官方SQL Server镜像的容器hostname由Docker在启动时自动分配,你在Dockerfile中用ENV HOSTNAME "sqlpreview"手动设置不会生效——Docker容器启动时会覆盖这个环境变量,同时官方镜像的SQL Server初始化逻辑依赖容器实际hostname完成证书绑定、实例识别等操作,手动设置会导致服务配置异常。
解决:删除Dockerfile中的ENV HOSTNAME "sqlpreview"行
2. 跳过了官方镜像的初始化流程
官方SQL Server镜像的默认启动逻辑并非直接运行/opt/mssql/bin/sqlservr,而是通过entrypoint脚本先完成权限检查、配置初始化(比如SA密码生效、端口监听配置)等前置操作。你直接指定CMD /opt/mssql/bin/sqlservr跳过了这些步骤,导致数据库未完成初始化,自然无法连接。
解决:删除Dockerfile中的CMD /opt/mssql/bin/sqlservr行,保留官方镜像的默认启动逻辑
修正后的Dockerfile
# Use the official SQL Server 2022 image from Microsoft FROM mcr.microsoft.com/mssql/server:2022-preview-ubuntu-22.04 # Set environment variables ENV MSSQL_SA_PASSWORD "<PWD>" ENV ACCEPT_EULA "Y" ENV MSSQL_PID "Evaluation" # Expose the SQL Server port(官方镜像已默认配置,此行可省略) EXPOSE 1433
启动命令(需保留端口映射)
构建镜像并启动容器时,必须加上端口映射参数,和你之前用官方镜像的方式一致:
docker build -t my-mssql-image . docker run -d -p 1433:1433 --name my-mssql-container my-mssql-image
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

