Подключение к локальному SQL Server из приложения .NET Core, работающего в докере - PullRequest
0 голосов
/ 16 мая 2019

У меня в докере запущено консольное приложение .NET, и я хочу подключиться к локальной базе данных MSSQL (не докеризованной!), Но я не могу этого сделать.Подключение к БД на удаленном сервере по IP-адресу работает нормально, но использование строки подключения, например Data Source=DESKTOP-9DRU731;Initial Catalog=DB;User id=user;password=password;, выдает ошибку

System.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: 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

Есть ли способ сделать это?

Я уже пробовалдобавление expose в dockerfile и сопоставление портов в docker compose для порта 1433, а также установка сети в качестве хоста.В моей БД включен удаленный доступ, и я могу подключиться к нему, когда я включаю IP-адрес хоста и порт в строку подключения, но требуется, чтобы строка подключения оставалась неизменной.Я также пытался использовать host.docker.internal, но опять не повезло.Я думаю, что некоторые из них могут потерпеть неудачу из-за среды, которую я использую, а именно:

  • Win 10 Home (что означает использование Docker Toolbox, а не Docker для Windows)
  • Контейнеры Linux

Я также пытался использовать мостовую сеть, но в этом случае я даже не могу добраться до той части, когда пытаюсь подключиться к БД, как раньше, я пытаюсь создать очередь служебной шиныи он завершается с ошибкой сокета.

Мой dockerfile:

FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:2.2-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "app.dll"]

И docker compose:

version: '3.4'

services:
  app:
    image: ${DOCKER_REGISTRY-}app
    build:
      context: .
      dockerfile: app/Dockerfile

EDIT

Благодаря @Mihai есть возможное решение.Добавление

extra_hosts:
      - "DESKTOP-9DRU731:<your_host_ip>"

в Dockerfile работает.К сожалению, я ищу более общее решение.

Я добавлю больше контекста - у меня есть около 100 строк подключения, хранящихся в удаленной БД.Они указывают на базы данных, специфичные для экземпляров внешнего приложения.Эти БД расположены на хосте или в частной сети хоста, и мне нужно подключиться к ним, используя имя сервера или IP-адрес из этой частной сети.

1 Ответ

1 голос
/ 16 мая 2019

Ваш docker-compose.yml:

version: '3.4'

services:
  app:
    image: ${DOCKER_REGISTRY-}app
    build:
      context: .
      dockerfile: app/Dockerfile
    extra_hosts:
      - "DESKTOP-9DRU731:<your_host_ip>"

Можете ли вы попробовать это, если это работает?

Если вы переместите хосты, то, очевидно, это сработает. Также, если хост меняет IP, он перестанет работать.

Я рекомендую извлечь эти значения из файла .env и вот так:

HOSTNAME=...
HOSTIP=....

И тогда ваш docker-compose.yml станет:

version: '3.4'

services:
  app:
    image: ${DOCKER_REGISTRY-}app
    build:
      context: .
      dockerfile: app/Dockerfile
    extra_hosts:
      - "$HOSTNAME:$HOSTIP"

Таким же образом, если у вас есть больше служб и что-то меняется, вам нужно только обновить файл .env. Также .env может использоваться несколькими файлами docker-compose.

...