We have created ASP NET Core App with existing sql server.
const string connectionString = @"Server=hostname\sqlexpress;Database=DEVDB;User Id=sa;Password=password;"; services.AddDbContext<RecruitmentToolsDatabaseContext>(options => options.UseSqlServer(connectionString));
It works on windows. After creating docker image with same settings we can't connect to db server.
fail: Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory An exception occurred in the database while iterating the results of a query. System.Data.SqlClient.SqlException: 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: 35 - An internal exception was caught) ---> System.AggregateException: One or more errors occurred. (No such device or address) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address at System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult) at System.Net.Dns.EndGetHostAddresses(IAsyncResult asyncResult) at System.Net.Dns.<>c.<GetHostAddressesAsync>b__14_1(IAsyncResult asyncResult) at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) --- End of stack trace from previous location where exception was thrown ---
We have created freetds configuration /etc/freetds/freetds.conf
[dev01] host = hostname instance = sqlexpress tds version = 8.0"
and we were able to connect to that db using sqsh.
FROM microsoft/dotnet:latest COPY . /app WORKDIR /app # Install apt packages RUN apt-get update && apt-get install -y \ freetds-bin \ freetds-common \ freetds-dev \ sqsh RUN touch /etc/freetds/freetds.conf RUN echo "[dev01]" > /etc/freetds/freetds.conf RUN echo "host = hostname" >> /etc/freetds/freetds.conf RUN echo "instance = sqlexpress" >> /etc/freetds/freetds.conf RUN echo "tds version = 8.0" >> /etc/freetds/freetds.conf RUN touch /home/.sqshrc RUN echo "\set username=sa" > /home/.sqshrc RUN echo "\set password=password" >> /home/.sqshrc RUN echo "\set style=vert" >> /home/.sqshrc RUN ["dotnet", "restore"] RUN ["dotnet", "build"] EXPOSE 5000/tcp ENV ASPNETCORE_URLS http://*:5000 ENTRYPOINT ["dotnet", "run"] #CMD ["bash"]
Besides normal ASP .NET Core this image contains freetds and sqsh for our testing purpose. Our app starts normally and it is working. The problem happen when we try to connect to sql it throws .net exception.