Мы создали приложение ASP NET Core с существующим SQL-сервером.Не удается подключиться к SQL Server из контейнера Docker
const string connectionString = @"Server=hostname\sqlexpress;Database=DEVDB;User Id=sa;Password=password;";
services.AddDbContext<RecruitmentToolsDatabaseContext>(options => options.UseSqlServer(connectionString));
Он работает на окнах. После создания изображения докеров с одинаковыми настройками мы не можем подключиться к серверу db.
Ошибка:
fail: Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory[1]
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 ---
Мы создали конфигурацию FreeTDS /etc/freetds/freetds.conf
[dev01]
host = hostname
instance = sqlexpress
tds version = 8.0"
и мы смогли подключиться к тому, что БД с помощью sqsh.
Любые идеи?
Редактировать
Мои Dockerfile:
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"]
Кроме обычной ASP .NET Ядра этот образ содержит FreeTDS и sqsh для нашего тестирования цели. Наше приложение запускается нормально и работает. Проблема возникает, когда мы пытаемся подключиться к sql, она выдает исключение .net.
Пожалуйста, не заставляйте теги в заголовок вопроса – Tseng
FreeTDS не имеет ничего общего с ASP.NET. В сообщении четко сказано, что вы даже не можете получить доступ к серверу из-за неправильного имени сервера или правила брандмауэра. Можете ли вы даже пинговать сервер? Docker не разрешает исходящие подключения по умолчанию, вам нужно указать, что разрешено. –
Да, я могу пинговать этот сервер. Я добавляю хост с командой запуска docker, и я могу связаться с сервером с именем экземпляра, пользователем и паролем из этого изображения докеров, которое я проверил с помощью FreeTDS. – bizon