我的SQL Server数据库作为Docker容器运行良好,我能够在SSMS中连接,但是当我的web应用程序试图连接到这些Server实例时,它会失败。请参阅下面的异常错误:
EPiServer.Framework.Initialization.InitializationEngine[0]
Initialize action failed for 'Initialize on class EPiServer.Data.DataInitialization, EPiServer.Data, Version=12.4.2.0, Culture=neutral, PublicKeyToken=- - - -'
Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server: Could not open a connection to SQL Server)您可以在下面看到我的docker-compose文件:
version: "3.9"
services:
sql-commerce:
container_name: "sql-commerce"
image: mcr.microsoft.com/azure-sql-edge
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Passw0rd123!
- DB_NAME=commerce
ports:
- '1433:1433'
volumes:
- ./databases_project/files/data/commerce:/var/opt/mssql/data
sql-cms:
container_name: "sql-cms"
image: mcr.microsoft.com/azure-sql-edge
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Passw0rd123!
- DB_NAME=cms
ports:
- '8080:1433'
volumes:
- ./databases_project/files/data/cms:/var/opt/mssql/data
web:
build: .
environment:
EcfSqlConnection: "sql-commerce"
EPiServerDB: "sql-cms"
ports:
- '3080:80'然后,这将对同一级别的Dockerfile进行如下操作:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /ProjectName
COPY ["Applications/Website.Src/Website.Src.csproj", "Website.Src/"]
RUN dotnet restore "Website.Src/Website.Src.csproj" --source https://api.nuget.org/v3/index.json --source https://nuget.optimizely.com/feed/packages.svc/
COPY . .
WORKDIR "/ProjectName/Applications/Website.Src"
RUN dotnet build "Website.Src.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Website.Src.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Website.Src.dll"]我的连接字符串如下所示:
"ConnectionStrings": {
"EcfSqlConnection": "Server=localhost,1433;Database=projectCommerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
"EPiServerDB": "Server=localhost,8080;Database=projectCms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
},对我哪里出了问题有什么想法吗?
更新
我试图在连接字符串中以sql容器名称而不是本地主机为目标,但是即使这样也无法连接。
"ConnectionStrings": {
"EcfSqlConnection": "Server=sql-commerce,1433;Database=projectCommerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
"EPiServerDB": "Server=sql-cms,8080;Database=projectCms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
},发布于 2022-05-03 16:04:36
在您的停靠-组合中,每个容器充当自己的主机。当您在连接字符串中引用localhost时,web容器将其视为自身,而不是主机(停靠器)机器。
您也可以通过设置不同的网络来使对接器中的事情变得复杂,但是默认情况下,您的容器都将位于同一个网络上。我喜欢为每个容器指定一个主机名,如下所示:
services:
sql-commerce:
hostname: sql-commerce
container_name: sql-commerce然后,您可以在连接字符串中使用该名称。
如果您不希望将ports服务打开给主机-- expose只允许您将它们保存在坞网络中,那么您还可以查看expose和sql之间的区别。现在,我认为您需要为这两个连接指定端口1433 (与对接网络的内部连接),其中第二个连接只在主机上侦听8080。
发布于 2022-05-03 19:10:47
不能使用localhost在容器之间进行通信。在容器中使用localhost只会指向它自己。
Docker有内置的DNS服务器,容器可以像您一样使用容器名称相互连接,但是您的数据库名在示例中仍然是错误的,根据您的撰写文件,它们应该是商业和cms。
"ConnectionStrings": {
"EcfSqlConnection": "Server=sql-commerce,1433;Database=commerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
"EPiServerDB": "Server=sql-cms,8080;Database=cms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
},发布于 2022-09-19 16:13:17
我也有同样的错误,尝试从连接字符串中删除端口,如下所示:
"ConnectionStrings": {
"EcfSqlConnection": "Server=sql-commerce;Database=projectCommerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
"EPiServerDB": "Server=sql-cms,8080;Database=projectCms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
},https://stackoverflow.com/questions/72101041
复制相似问题