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
|- docker-compose.yml
|- docker
|- mssqlserver
|- Dockerfile
|- initdb.d
|- entrypoint.sh
|- import-data.sh
|- demo.sql
|- Demo.dbo.DEMO.csv
|- data
|- log
|- secrets
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