Image personnalisée

Aperçu

Cette page explique comment créer une image personnalisée de la base de données WorkflowGen afin d'ajouter du code personnalisé ou des scripts SQL à exécuter. Gardez à l'esprit que ce guide fournit des exemples simples, vous n'êtes donc pas limité à ce qui est montré ici. Les exemples utiliseront la version Linux de l'image. Tous les exemples de code sont dans PowerShell.

Prérequis

  • Une machine Linux avec Docker installé. Consultez les instructions spécifiques à votre distribution pour installer et configurer le moteur Docker. Consultez l'article Install Docker Engine pour les instructions d'installation. Il pourrait ne pas avoir toutes les distributions prises en charge.

  • Un Mac avec Docker Desktop pour Mac installé.

  • Une machine Windows 10 Pro avec Docker Desktop pour Windows installé et les conteneurs Linux activés. Il est recommandé d'utiliser le backend WSL 2 (sous-système Windows pour Linux) s'il est disponible. Sinon, utilisez la valeur par défaut.

Exemple simple

La création de votre propre image WorkflowGen est aussi simple que la création d'un fichier Dockerfile. Créez un répertoire de contexte et ajoutez-y un fichier vide appelé Dockerfile :

Arborescence des fichiers :

context-dir/
    Dockerfile

Vous allez ensuite ouvrir le Dockerfile et y ajouter du code :

FROM advantys/workflowgen-sql:7.18.3-ubuntu-18.04

Cette instruction indique que vous souhaitez baser votre image sur l'image de la base de données WorkflowGen. À partir d'ici, vous pouvez ajouter d'autres instructions pour ajouter des fichiers ou des scripts à exécuter et effectuer l'initialisation personnalisée que vous souhaitez. Par exemple, vous pouvez ajouter un script SQL personnalisé et l'exécuter :

Arborescence des fichiers :

context-dir/
    Dockerfile
    myscript.sql
    customcode.ps1

Dockerfile :

FROM advantys/workflowgen-sql:7.18.3-ubuntu-18.04

COPY ./myscript.sql /usr/local/mycorporation/scripts/
COPY ./customcode.ps1 /usr/local/bin/
CMD /usr/local/bin/customcode.ps1

Comme vous pouvez le voir, PowerShell est disponible dans le conteneur Linux afin que les scripts puissent être effectués facilement entre Windows et Linux. Si vous préférez les scripts Bash, vous pouvez l'utiliser tout aussi facilement en remplaçant le script .ps1 par votre propre script .sh.

customcode.ps1 :

<#
.SYNOPSIS
    Custom script that creates a new database if not exists and executes
    a custom SQL script with a prepared variable.
.NOTES
    File name: customcode.ps1
#>
#requires -Version 7.0

Import-Module SqlServer
Import-Module /usr/local/lib/Utils.psm1 -Function "Get-EnvVar"
Import-Module /usr/local/lib/Crypto.psm1

$saPassword = Get-EnvVar "SA_PASSWORD"
$aSecret = Get-EnvVar "MYCORPORATION_SECRET"

$myCustomDatabaseName = "MYDB"
$myDatabasePath = Join-Path "/" "var" "opt" "mssql" "data" "$myCustomDatabaseName.mdf"
$myScriptPath = Join-Path "/" "usr" "local" "mycorporation" "scripts" "myscript.sql"
$commonArgs = @{
    ServerInstance = "localhost"
    Username = "sa"
    Password = $saPassword
}

# MYDB not created
if (-not (Test-Path $myDatabasePath)) {
    $secretSalt = Get-Salt # from Crypto.psm1
    $secretPassHash = Get-PasswordHash ($salt + $aSecret)

    Invoke-Sqlcmd "CREATE DATABASE [`$(DATABASE_NAME)] CONTAINMENT = PARTIAL" `
        -Variable ,"DATABASE_NAME=$myCustomDatabaseName" `
        @commonArgs
    Invoke-Sqlcmd -InputFile $myScriptPath `
        -Variable ,"A_SECRET=$secretPassHash" `
        @commonArgs
}

if ($args.Count -gt 0 {
    Invoke-Expression $args
} else {
    # Restart the SQL Server process so that the logs
    # are written in the standard output file
    Stop-Process -Name sqlservr -Force
    Start-Process -FilePath /opt/mssql/bin/sqlservr -Wait
}

Ce script ressemble beaucoup mais est en fait simple. Il commence par importer les bibliothèques SqlServer, Utils et Crypto, puis obtient des informations de l'environnement et initialise les variables en fonction de cela. Ensuite, il vérifie si la base de données a déjà été créée en vérifiant l'existence d'un fichier .mdf avant de hacher et saler un secret personnalisé, en créant une base de données personnalisée et en exécutant un script avec une variable préparée. Si aucun argument n'est transmis au script, il redémarre le processus SQL Server afin que ses journaux soient écrits dans la sortie standard. S'il y a des arguments, il exécute ce qui est passé.

La condition pour vérifier si la base de données est déjà créée est là car le script sera exécuté après chaque redémarrage et exécution du conteneur. Par conséquent, les fichiers d'état, y compris les fichiers .mdf et .ldf de toutes les bases de données à l'intérieur de SQL Server seront déjà là. Il ne sera pas nécessaire de recréer la base de données.

La dernière partie est une bonne pratique générale dans un conteneur Docker. Par exemple, si vous déboguez le conteneur et que vous souhaitez uniquement inviter une ligne de commande PowerShell après la séquence de démarrage, vous passerez PowerShell comme argument à la commande d'exécution comme suit :

 docker container run -it `
     # ...
     mycorporation/workflowgen-sql:7.18.3-ubuntu-18.04 /usr/local/bin/customcode.ps1 pwsh

L'argument powershell sera exécuté par la commande Invoke-Expression et une nouvelle invite de commandes PowerShell s'affichera.

Maintenant, tout ce que vous avez à faire est de construire le conteneur :

Set-Location path/to/context-dir
docker container build `
    -t mycorporation/workflowgen-sql:7.18.3-ubuntu-18.04 `
    .

Scripts disponibles dans l'image

Advantys a développé certains scripts et modules PowerShell pour prendre en charge certaines fonctionnalités. Voici une liste de ces scripts avec leurs descriptions :

  • docker-entrypoint.ps1 : Le script principal qui s'exécute lorsque vous exécutez un conteneur. Il gère l'analyse des variables d'environnement, l'initialisation de la base de données WorkflowGen, etc.

    • Chemin Windows : C:\docker-entrypoint.ps1

    • Chemin Linux : /usr/local/bin/docker-entrypoint.ps1

  • C:\monitor-database.ps1 (version Windows uniquement) : Ce script gère la surveillance du processus de base de données, ainsi que la collecte des journaux de conteneur et leur redirection vers la sortie standard. La version Linux n'a pas besoin de ce script car le processus SQL Server s'exécute au premier plan et écrit ses journaux dans la sortie standard.

  • /usr/local/bin/healthcheck.ps1 (version Linux uniquement) : Ce script gère la vérification périodique qui indique si la base de données fonctionne correctement ou non. Ceci est défini dans le Dockerfile et est géré par le moteur Docker. La version Windows a également un bilan de santé défini. C'est une commande simple qui n'a pas besoin de son propre script. Dans Kubernetes, il est ignoré, vous devez donc fournir une sonde liveness (« liveness probe »). Pour plus d'informations, consultez l'article Kubernetes Configure Liveness, Readiness and Startup Probes (disponible en anglais uniquement).

  • *.psm1: Divers modules PowerShell développés disponibles dans l'image.

    • Chemin Windows : C:\

    • Chemin Linux : /usr/local/lib/

  • /usr/local/bin/set-state.ps1 (version Linux uniquement) : Définit l'état du conteneur, par exemple en mettant la base de données WorkflowGen hors ligne ou en ligne.

    • Chemin Windows : C:\

    • Chemin Linux : /usr/local/bin/

Dernière mise à jour