Docker + mssql-server-linux: как запустить файл.sql во время сборки (из файла Docker)

Я пытаюсь создать собственное изображение Docker с помощью MSSQL DB для разработки. Он основан на изображении microsoft/mssql-server-linux. Во время сборки я хочу скопировать некоторые .sql файлы в контейнер, а затем запустить эти сценарии (для создания схем БД, таблиц, вставки некоторых данных и т.д.). Мой Dockerfile выглядит так:

# use MSSQL 2017 image on Ubuntu 16.04
FROM microsoft/mssql-server-linux:2017-latest

# create directory within SQL container for database files
RUN mkdir -p /opt/mssql-scripts

# copy the database files from host to container
COPY sql/000_create_db.sql /opt/mssql-scripts

# set environment variables
ENV [email protected]
ENV ACCEPT_EULA=Y

# run initial scripts
RUN /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[email protected]' -i /opt/mssql-scripts/000_create_db.sql

Содержание 000_create_db.sql не важно, на мой взгляд.

Реальная проблема заключается в том, когда я пытаюсь создать этот Dockerfile с Dockerfile команды docker build -t demo. Я всегда получаю эти ошибки:

Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP Provider: Error code 0x2749.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..

Но когда я удаляю последнюю команду (запускаю исходные скрипты), создаю и запускаю образ и вызываю ту же команду:

docker build -t demo .
docker run -p 1433:1433 --name mssql -d demo
docker exec -it mssql "bash"
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[email protected]' -i /opt/mssql-scripts/000_create_db.sql

Тогда все идет хорошо. Почему я не могу запустить скрипт из Dockefile?

Ответ 1

Я закончил использование слегка модифицированной версии решения VDR, которая ждет, когда sqlservr начнет с проверки журналов вместо спящего 10 секунд:

RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started" \
    && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[email protected]' -i /opt/mssql-scripts/000_create_db.sql \
    && pkill sqlservr 

Ответ 2

Из mssql-server-linux dockerfile похоже, что mssql запускается при запуске docker, поэтому вам нужно изменить последнюю команду "RUN" в вашем dockerfile, чтобы запустить sql-сервер в фоновом режиме, запустить ваш sql файл и остановка sql-сервера.

RUN /opt/mssql/bin/sqlservr --accept-eula & sleep 10 \
    && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '[email protected]' -i /opt/mssql-scripts/000_create_db.sql \
    && pkill sqlservr 

Ответ 3

Когда вы строите изображение, основной процесс не работает. В вашем случае основным процессом является SQL Server.

Процесс запускается только при запуске контейнера с запуском командной docker run...

И вы можете сделать инициализацию базы данных на этом этапе. microsoft/mssql-server-linux Dockerfile содержит некоторые советы

Скопируйте все файлы времени выполнения SQL Server из сборки в изображение. COPY./install/

Просто скопируйте сценарии инициализации фазы сборки в ./install dir, и он будет ./install на начальную фазу.