Démarrez SQL Server avec Docker et enregistrez les données initiales

Placez les données initiales dans le conteneur Docker de SQL Server et démarrez-le. Utilisez l'image officielle de Microsoft Docker. Dans MySQL, le mécanisme d'entrée de données initial est intégré depuis le début, mais SQL Server ne l'a pas, j'ai donc créé un shell.

Image Docker Microsoft SQL Server (https://hub.docker.com/_/microsoft-mssql-server) Référence: exemple d'entrée de données lié à partir du site officiel (https://github.com/twright-msft/mssql-node-docker-demo-app) Utiliser SQL Server Express avec Qiita Docker pour Windows

Structure du répertoire

|- docker-compose.yml
|- docker
    |- mssqlserver
        |- Dockerfile
        |- initdb.d
            |- entrypoint.sh
            |- import-data.sh
            |- demo.sql
            |- Demo.dbo.DEMO.csv
        |- data
        |- log
        |- secrets

Chaque dossier

docker-compose.yml

Pour les variables d'environnement SQL Server définies dans l'environnement, cliquez ici (https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql Voir -server-ver15).

docker-compose.yml


version: '3'

services:
  mssql:
    build:
      context: ./docker/mssqlserver/
    image: mssql
    ports:
      - 1433:1433
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=password
      - MSSQL_PID=Express #Édition SQL Server ou clé de produit
      - MSSQL_LCID=1041 #ID de paramètres régionaux japonais(https://www.ryadel.com/en/microsoft-windows-lcid-list-decimal-and-hex-all-locale-codes-ids/)
      - MSSQL_COLLATION=Japanese_CI_AS #Ordre de classement
    volumes:
      - ./docker/mssqlserver/initdb.d:/docker-entrypoint-initdb.d
      - ./docker/mssqlserver/data:/var/opt/mssql/data
      - ./docker/mssqlserver/log:/var/opt/mssql/log
      - ./docker/mssqlserver/secrets:/var/opt/mssql/sec

Dockerfile

Copiez les données initiales et le script shell d'entrée et appelez entrypoint.sh. (Au fait, «EXPOSE» semble n'être qu'un document.)

Dockerfile


FROM mcr.microsoft.com/mssql/server:2017-latest

USER root
SHELL ["/bin/bash", "-c"]

WORKDIR /docker-entrypoint-initdb.d
COPY ./initdb.d/ /docker-entrypoint-initdb.d/
RUN chmod -R +x /docker-entrypoint-initdb.d

EXPOSE 1433

ENTRYPOINT ["/bin/bash", "./entrypoint.sh"]

entrypoint.sh

Démarrez le shell d'enregistrement des données et SQL Server en même temps. Je suis un peu coincé ici, mais si je lance d'abord SQL Server, le conteneur s'arrêtera après l'exécution de import-data.sh. Si vous mettez SQL Server derrière, le conteneur continuera à démarrer. (Autrement dit, Docker décide-t-il d'arrêter le conteneur en fonction du fait que le dernier processus exécuté est actif?)

Initialize MS SQL in Docker container - create database at startup(https://www.softwaredeveloper.blog/initialize-mssql-in-docker-container)

entrypoint.sh


#!/bin/bash

LOG_OUT=/var/opt/mssql/log/init-stdout.log
LOG_ERR=/var/opt/mssql/log/init-stderr.log

exec 1>>$LOG_OUT
exec 2>>$LOG_ERR

#Si SQL Server est devant, le conteneur s'arrête.
#/opt/mssql/bin/sqlservr & /docker-entrypoint-initdb.d/import-data.sh
/docker-entrypoint-initdb.d/import-data.sh & /opt/mssql/bin/sqlservr

import-data.sh

Puisqu'il démarre en même temps que SQLServer, il dort pendant 20 secondes au début jusqu'à ce que l'instance démarre. De plus, lorsque l'importation SQL ou CSV est exécutée, en cas d'erreur, elle attend 1 seconde et se réexécute.

import-data.sh


#!/bin/bash
sleep 20

if [ `ls -U1 /var/opt/mssql/data | grep DEMO | wc -l` -eq 0 ]; then
    cd /docker-entrypoint-initdb.d
    sql_files=`ls *.sql`

    for file in $sql_files;
    do
        for i in {1..30};
        do
            /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -i $file
            if [ $? -eq 0 ]
            then
                echo "${file} completed."
                break
            else
                echo "${file} failed."
                sleep 1
            fi
        done
    done

    csv_files=`ls *.csv`
    for file in $csv_files;
    do
        for i in {1..30};
        do
            table_name=`basename $file .csv`
            /opt/mssql-tools/bin/bcp $table_name in $file -c -t',' -S localhost -U sa -P $SA_PASSWORD
            if [ $? -eq 0 ]
            then
                echo "${file} completed."
                break
            else
                echo "${file} failed."
                sleep 1
            fi
        done
    done
fi

Recommended Posts

Démarrez SQL Server avec Docker et enregistrez les données initiales
Lancer l'image Docker avec les données initiales injectées avec docker-compose
[Rails] Création initiale des données avec seed
[SRE / Docker] Démarrer le contrôle avec Dockerize
[Rails] Entrée de données initiale avec seed_fu!
[Linux] Démarrer le conteneur Apache avec Docker
Comment démarrer Camunda avec Docker
Serveur proxy par squid en utilisant l'image docker
Démarrage Docker + Spring-boot
Docker Compose ne démarre pas avec l'affichage d'erreur docker.credentials.errors.InitializationError