Contrairement à MySQL ou PostgreSQL, l'image officielle de SQL Server pour Docker ne propose pas de répertoire natif (tel que /docker-entrypoint-initdb.d/) permettant d'exécuter automatiquement des scripts SQL lors du premier démarrage du conteneur. Pour contourner cette limitation et configurer automatiquement une base de données, des schémas et des utilisateurs, il est nécessaire d'implémenter une stratégie d'initialisation personnalisée lors de la construction de l'image.
L'approche consiste à démarrer temporairement le moteur SQL Server en arrière-plan pendant la phase de build. Une fois le service opérationnel, le script d'initialisation est exécuté via l'utilitaire en ligne de commande, puis le processus est arrêté proprement. Au démarrage réel du conteneur, l'image contient déjà les modifications persistées dans les fichiers de données.
1. Script d'initialisation SQL
Créez un fichier nommé bootstrap.sql contenant les instructions nécessaires pour générer la base de données, le schéma, ainsi que les identifiants de connexion et les utilisateurs applicatifs.
-- Configuration de la base de données et des permissions
USE master;
GO
IF DB_ID('inventory_system') IS NOT NULL
DROP DATABASE inventory_system;
GO
CREATE DATABASE inventory_system;
GO
USE inventory_system;
GO
CREATE SCHEMA warehouse;
GO
-- Création de la connexion et de l'utilisateur applicatif
IF SUSER_ID('stock_manager') IS NOT NULL
DROP LOGIN stock_manager;
GO
CREATE LOGIN stock_manager WITH PASSWORD = 'C0mpl3x!P@ssw0rd';
GO
CREATE USER stock_manager FOR LOGIN stock_manager WITH DEFAULT_SCHEMA = warehouse;
GO
ALTER ROLE db_ddladmin ADD MEMBER stock_manager;
GRANT CONTROL ON DATABASE::inventory_system TO stock_manager;
GO
2. Configuraton du Dockerfile
Le Dockerfile doit copier le script SQL dans l'image, démarrer le service SQL Server en arrière-plan, attendre que le moteur soit prêt à accepter les connexions, exécuter le script, puis terminer le processus temporaire.
FROM mcr.microsoft.com/mssql/server:2019-latest
# Configuration des variables d'environnement requises
ENV ACCEPT_EULA="Y"
ENV SA_PASSWORD="R00t#Adm1n!2024"
EXPOSE 1433
# Préparation du répertoire pour les scripts d'initialisation
RUN mkdir -p /opt/custom-init
COPY bootstrap.sql /opt/custom-init/
WORKDIR /opt/custom-init
# Démarrage temporaire, attente de la disponibilité, exécution et arrêt
RUN /opt/mssql/bin/sqlservr & \
SQL_PID=$!; \
until /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -Q "SELECT 1" -b > /dev/null 2>&1; do \
sleep 2; \
done; \
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "$SA_PASSWORD" -i bootstrap.sql; \
kill $SQL_PID; \
wait $SQL_PID; \
exit 0
Cette structure utilise une boucle until avec sqlcmd pour vérifier la disponibilité réelle du moteur de base de données, ce qui est plus robuste que l'analyse des journaux système.
3. Orchestration avec Docker Compose
Définissez le service dans un fichier docker-compose.yml pour construire et exécuter l'image persnonalisée.
version: '3.8'
services:
data-store:
build:
context: .
dockerfile: Dockerfile
container_name: sqlserver_bootstrapped
ports:
- "1433:1433"
restart: always
4. Déploiement et vérificaiton
Lancez la construction et le démarrage du conteneur à l'aide de la commande suivante :
docker-compose up -d --build data-store
Une fois le processus terminé, le conteneur est opérationnel. Vous pouvez vous connecter à l'instance SQL Server via votre client de base de données préféré en utilisant l'utilisateur stock_manager et le mot de passe défini dans le script SQL, sur la base de données inventory_system.