为什么在构建 docker 图像时 sqlcmd 无法连接?
Why can't sqlcmd connect while building a docker image?
我正在尝试从 Docker 图像设置 Microsoft SQL Server
并加载脚本文件以创建数据库并向该数据库添加几个文件组。
dockerfile
看起来像这样:
# Get MSSQL image
FROM mcr.microsoft.com/mssql/server:2017-CU24-ubuntu-16.04
# Set arguments (must be after FROM)
ARG SA_PASSWORD=SecretComplexPassword1234!
# Set environment variables for MSSQL
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=$SA_PASSWORD
# Setup sqlcmd symlink
RUN ln -sfn /opt/mssql-tools/bin/sqlcmd /usr/bin/sqlcmd
# Setup Database
COPY ./init_script_core.sql /tmp
RUN sqlcmd -S localhost -U SA -P $SA_PASSWORD -i /tmp/init_script_core.sql
调用 sqlcmd
步骤需要一些时间(大约 8 秒)然后 returns 此错误:
> [4/4] RUN sqlcmd -S localhost -U SA -P SecretComplexPassword1234! -i /tmp/init_script_core.sql:
#8 8.720 Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
#8 8.720 Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2749.
#8 8.720 Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
我首先从 dockerfile
中删除了 sqlcmd
步骤,以确保我可以毫无问题地构建 运行 dockerfile
。然后我从 PowerShell
执行了 sqlcmd
,唯一的区别是脚本文件的路径。然后我验证了脚本实际上已经执行了,我可以通过在我的本地 (Windows) 机器上使用 SSMS
连接到 SQL Server
来看到差异:
PS C:\github> docker build -t docker-core-test .
PS C:\github> docker run -d -i -p 11433:1433 docker-core-test
08c831bf99533301c0225eae9ea6433006dba0f052666782ac42de140784cc10
PS C:\GitHub> sqlcmd -S localhost,11433 -U SA -P SecretComplexPassword1234! -i "C:\GitHub\init_script_core.sql"
由于 SQL Server
或脚本的实际设置似乎没有任何问题,我开始 Google 并发现这些解决方案适用于其他人但是不幸的是不适合我:
- 在
sqlcmd
之前添加一个 10 秒的计时器,让 SQL Server
有时间开始
- 将端口添加到
localhost -> localhost,1433
- 改变
localhost 127.0.0.1
- 将端口添加到
127.0.0.1 -> 127.0.0.1,1433
问题:为什么在构建我的 Docker 图像时调用 sqlcmd
超时?
你只是在构建一个镜像,数据库进程不是运行ning。这就是 sqlcmd 无法连接的原因。
数据库是在您 运行 从镜像中创建容器时启动的,而不是在镜像构建阶段
Microsoft SQL Docker image 文档链接到一个示例,可能正是您要查找的内容
You can also use the tools in an entrypoint.sh script to do things like create databases or logins, attach databases, import data, or other setup tasks. See this example of using an entrypoint.sh script to create a database and schema and bcp in some data.
我正在尝试从 Docker 图像设置 Microsoft SQL Server
并加载脚本文件以创建数据库并向该数据库添加几个文件组。
dockerfile
看起来像这样:
# Get MSSQL image
FROM mcr.microsoft.com/mssql/server:2017-CU24-ubuntu-16.04
# Set arguments (must be after FROM)
ARG SA_PASSWORD=SecretComplexPassword1234!
# Set environment variables for MSSQL
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD=$SA_PASSWORD
# Setup sqlcmd symlink
RUN ln -sfn /opt/mssql-tools/bin/sqlcmd /usr/bin/sqlcmd
# Setup Database
COPY ./init_script_core.sql /tmp
RUN sqlcmd -S localhost -U SA -P $SA_PASSWORD -i /tmp/init_script_core.sql
调用 sqlcmd
步骤需要一些时间(大约 8 秒)然后 returns 此错误:
> [4/4] RUN sqlcmd -S localhost -U SA -P SecretComplexPassword1234! -i /tmp/init_script_core.sql:
#8 8.720 Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login timeout expired.
#8 8.720 Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2749.
#8 8.720 Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
我首先从 dockerfile
中删除了 sqlcmd
步骤,以确保我可以毫无问题地构建 运行 dockerfile
。然后我从 PowerShell
执行了 sqlcmd
,唯一的区别是脚本文件的路径。然后我验证了脚本实际上已经执行了,我可以通过在我的本地 (Windows) 机器上使用 SSMS
连接到 SQL Server
来看到差异:
PS C:\github> docker build -t docker-core-test .
PS C:\github> docker run -d -i -p 11433:1433 docker-core-test
08c831bf99533301c0225eae9ea6433006dba0f052666782ac42de140784cc10
PS C:\GitHub> sqlcmd -S localhost,11433 -U SA -P SecretComplexPassword1234! -i "C:\GitHub\init_script_core.sql"
由于 SQL Server
或脚本的实际设置似乎没有任何问题,我开始 Google 并发现这些解决方案适用于其他人但是不幸的是不适合我:
- 在
sqlcmd
之前添加一个 10 秒的计时器,让SQL Server
有时间开始 - 将端口添加到
localhost -> localhost,1433
- 改变
localhost 127.0.0.1
- 将端口添加到
127.0.0.1 -> 127.0.0.1,1433
问题:为什么在构建我的 Docker 图像时调用 sqlcmd
超时?
你只是在构建一个镜像,数据库进程不是运行ning。这就是 sqlcmd 无法连接的原因。
数据库是在您 运行 从镜像中创建容器时启动的,而不是在镜像构建阶段
Microsoft SQL Docker image 文档链接到一个示例,可能正是您要查找的内容
You can also use the tools in an entrypoint.sh script to do things like create databases or logins, attach databases, import data, or other setup tasks. See this example of using an entrypoint.sh script to create a database and schema and bcp in some data.