Starten Sie SQL Server mit Docker und registrieren Sie die Anfangsdaten

Legen Sie die Anfangsdaten in den Docker-Container von SQL Server und starten Sie ihn. Verwenden Sie das offizielle Microsoft Docker-Image. In MySQL ist der anfängliche Dateneingabemechanismus von Anfang an integriert, in SQL Server ist er jedoch nicht vorhanden. Daher habe ich eine Shell erstellt.

Microsoft SQL Server Docker-Image (https://hub.docker.com/_/microsoft-mssql-server) Referenz: Dateneingabebeispiel vom Beamten verlinkt (https://github.com/twright-msft/mssql-node-docker-demo-app) Verwenden Sie SQL Server Express mit Qiita Docker für Windows

Verzeichnisaufbau

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

Jede Datei

docker-compose.yml

Klicken Sie hier, um die in der Umgebung festgelegten SQL Server-Umgebungsvariablen anzuzeigen (https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql) Siehe -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 #SQL Server Edition oder Produktschlüssel
      - MSSQL_LCID=1041 #Gebietsschema ID Japanisch(https://www.ryadel.com/en/microsoft-windows-lcid-list-decimal-and-hex-all-locale-codes-ids/)
      - MSSQL_COLLATION=Japanese_CI_AS #Sortierreihenfolge
    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

Kopieren Sie die Anfangsdaten und das Eingabe-Shell-Skript und rufen Sie entrypoint.sh auf. (Übrigens scheint "EXPOSE" nur ein Dokument zu sein.)

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

Starten Sie gleichzeitig die Datenregistrierungsshell und SQL Server. Ich stecke hier ein wenig fest, aber wenn ich zuerst SQL Server starte, stoppt der Container, nachdem import-data.sh ausgeführt wurde. Wenn Sie SQL Server hinter sich lassen, wird der Container weiterhin gestartet. (Das heißt, entscheidet Docker, ob der Container gestoppt werden soll, basierend darauf, ob der zuletzt ausgeführte Prozess aktiv ist?)

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

#Wenn SQL Server vorne ist, wird der Container gestoppt.
#/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

Da es gleichzeitig mit SQLServer gestartet wird, wird es zu Beginn 20 Sekunden lang in den Ruhezustand versetzt, bis die Instanz gestartet wird. Wenn der SQL- oder CSV-Import ausgeführt wird, wartet er im Fehlerfall 1 Sekunde und wird erneut ausgeführt.

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

Starten Sie SQL Server mit Docker und registrieren Sie die Anfangsdaten
Starten Sie das Docker-Image mit den Anfangsdaten, die mit Docker-Compose eingefügt wurden
[Rails] Erste Datenerstellung mit Seed
[SRE / Docker] Starten Sie die Steuerung mit Dockerize
[Rails] Erste Dateneingabe mit seed_fu!
[Linux] Starten Sie den Apache-Container mit Docker
So starten Sie Camunda mit Docker
Proxyserver durch Tintenfisch mit Docker-Image
Docker + Spring-Boot-Start
Docker Compose startet nicht mit der Fehleranzeige docker.credentials.errors.InitializationError