web-dev-qa-db-fra.com

Docker + mssql-server-linux: comment lancer le fichier .sql pendant la construction (à partir de Dockerfile)

J'essaie de créer ma propre image Docker avec MSSQL DB pour le développement. Il est basé sur Microsoft/mssql-server-linux image. Pendant la construction, je veux copier quelques .sql fichiers dans le conteneur, puis exécutez ces scripts (pour créer des schémas de base de données, des tables, insérer des données, etc.). Mon Dockerfile ressemble à ceci:

# 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

Contenu de 000_create_db.sql n'est pas important à mon avis.

Le vrai problème est quand j'essaye de construire ce Dockerfile avec la commande docker build -t demo . J'ai toujours ces erreurs:

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

Mais lorsque je supprime la dernière commande (exécutant les scripts initiaux), je crée et exécute l'image et j'appelle la même commande comme ceci:

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

Alors tout va bien. Pourquoi ne puis-je pas exécuter le script à partir de Dockefile?

15
Tomáš Fábry

J'ai fini par utiliser une version légèrement modifiée de la solution de VDR qui attend que sqlservr démarre en vérifiant les journaux au lieu de dormir 10 secondes:

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

À partir de mssql-server-linux dockerfile , il semble que mssql soit démarré lors de l’exécution de docker, vous devez donc modifier votre dernière commande "RUN" dans votre dockerfile pour démarrer sql-server en arrière-plan, exécutez votre fichier sql et arrêtez le serveur sql.

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