web-dev-qa-db-ja.com

Docker + mssql-server-linux:ビルド中に.sqlファイルを起動する方法(Dockerfileから)

開発用にMSSQL DBを使用して独自のDockerイメージを作成しようとしています。 Microsoft/mssql-server-linuxイメージに基づいています。ビルド中に、いくつかの.sqlファイルをコンテナにコピーしてから、これらのスクリプトを実行します(DBスキーマ、テーブルの作成、データの挿入など)。私の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 MSSQL_SA_PASSWORD=P@ssw0rd
ENV ACCEPT_EULA=Y

# run initial scripts
RUN /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql

000_create_db.sqlの内容は、私の意見では重要ではありません。

本当の問題は、コマンドdocker build -t demo .でこのDockerfileをビルドしようとすると、常にこれらのエラーが発生することです。

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 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql

その後、すべてが順調です。 Dockefileからスクリプトを実行できないのはなぜですか?

15
Tomáš Fábry

最終的に、10秒スリープする代わりにログをチェックすることでsqlservrが開始するのを待つVDRのソリューションを少し修正したバージョンを使用しました。

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

Mssql-server-linux dockerfile から、mssqlはdocker runで開始されたように見えるので、dockerfileで最後の「RUN」コマンドを変更して、sql-serverをバックグラウンドで起動し、 sqlファイルを開き、sql-serverを停止します。

RUN /opt/mssql/bin/sqlservr --accept-eula & sleep 10 \
    && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql \
    && pkill sqlservr 
8
VDR