Как дождаться MSSQL в Docker Compose?C#

Место общения программистов C#
Ответить
Anonymous
 Как дождаться MSSQL в Docker Compose?

Сообщение Anonymous »

У меня есть служба (веб-приложение ASP.NET Core), зависящая от MSSQL. Службы организованы с помощью Docker Compose, и я хочу, чтобы Docker Compose сначала запускал базу данных и ждал, пока она будет готова, прежде чем запускать мой сервис. Для этого я определяю docker-compose.yml как:

Код: Выделить всё

version: '3.7'

services:

sql.data:
container_name: db_service
image: microsoft/mssql-server-linux:2017-latest
healthcheck:
test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-S", "http://localhost:1433", "-U", "sa", "-P", "Pass_word", "-Q", "SELECT 1", "||", "exit 1"]

my_service:
container_name: my_service_container
image: ${DOCKER_REGISTRY-}my_service
build:
context: .
dockerfile: MyService/Dockerfile
depends_on:
- sql.data
При этой проверке работоспособности Docker Compose не ждет готовности службы базы данных и запускает my_service сразу после этого, и, как и ожидалось, my_service не может подключиться к базе данных. Часть журнала:

Код: Выделить всё

Recreating db_service ... done
Recreating my_service_container ... done
Attaching to db_service, my_service_container
my_service_container | info: ...Context[0]
my_service_container |       Migrating database associated with context Context
my_service_container | info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
my_service_container |       Entity Framework Core 3.1.1 initialized 'Context' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: MigrationsAssembly=MyService
my_service_container | fail: Context[0]
my_service_container |       An error occurred while migrating the database used on context Context
my_service_container | 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)
...
exception details
...
my_service_container | ClientConnectionId:00000000-0000-0000-0000-000000000000
my_service_container exited with code 0
db_service | 2020-03-05 05:45:51.82 Server      Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4 (X64)
Nov 30 2018 12:57:58
Copyright (C) 2017 Microsoft Corporation
Developer Edition (64-bit) on Linux (Ubuntu 16.04.5 LTS)
2020-03-05 05:45:51.82 Server      UTC adjustment: 0:00
2020-03-05 05:45:51.82 Server      (c) Microsoft Corporation.
2020-03-05 05:45:51.82 Server      All rights reserved.
2020-03-05 05:45:51.82 Server      Server process ID is 4120.
2020-03-05 05:45:51.82 Server      Logging SQL Server messages in file '/var/opt/mssql/log/errorlog'.
2020-03-05 05:45:51.82 Server      Registry startup parameters:
-d /var/opt/mssql/data/master.mdf
-l /var/opt/mssql/data/mastlog.ldf
-e /var/opt/mssql/log/errorlog
Как показано в журналах, компоновка докера сначала запускает БД, но не ждет, пока она станет готовой, прежде чем запускать мою службу.

Я пробовал другой синтаксис проверки работоспособности, например:

Код: Выделить всё

test: /opt/mssql-tools/bin/sqlcmd -S http://localhost:1433 -U sa -P ${SA_PASSWORD} -Q "SELECT 1" || exit 1
Но ни то, ни другое не сработало должным образом.

Я проверил следующие источники в Интернете, но ни один из них не смог решить проблему:
  • ответ stackoverflow
  • комментарий github
  • пример github
Поддерживается ли эта функция вообще в версии 3.7? из-за этого запутанного комментария



Вопрос

Есть какие-нибудь мысли о том, как лучше всего дождаться запуска службы MSSQL?

Подробнее здесь: https://stackoverflow.com/questions/605 ... er-compose
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»