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