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ée. Consultez les instructions spécifiques à votre distribution pour installer et configurer le moteur Docker. Voir 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 :
1
context-dir/
2
Dockerfile
Copied!
Vous allez ensuite ouvrir le Dockerfile et y ajouter du code :
1
FROM advantys/workflowgen-sql:7.18.3-ubuntu-18.04
Copied!
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 :
1
context-dir/
2
Dockerfile
3
myscript.sql
4
customcode.ps1
Copied!
Dockerfile :
1
FROM advantys/workflowgen-sql:7.18.3-ubuntu-18.04
2
3
COPY ./myscript.sql /usr/local/mycorporation/scripts/
4
COPY ./customcode.ps1 /usr/local/bin/
5
CMD /usr/local/bin/customcode.ps1
Copied!
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 :
1
<#
2
.SYNOPSIS
3
Custom script that creates a new database if not exists and executes
4
a custom SQL script with a prepared variable.
5
.NOTES
6
File name: customcode.ps1
7
#>
8
#requires -Version 7.0
9
10
Import-Module SqlServer
11
Import-Module /usr/local/lib/Utils.psm1 -Function "Get-EnvVar"
12
Import-Module /usr/local/lib/Crypto.psm1
13
14
$saPassword = Get-EnvVar "SA_PASSWORD"
15
$aSecret = Get-EnvVar "MYCORPORATION_SECRET"
16
17
$myCustomDatabaseName = "MYDB"
18
$myDatabasePath = Join-Path "/" "var" "opt" "mssql" "data" "$myCustomDatabaseName.mdf"
19
$myScriptPath = Join-Path "/" "usr" "local" "mycorporation" "scripts" "myscript.sql"
20
$commonArgs = @{
21
ServerInstance = "localhost"
22
Username = "sa"
23
Password = $saPassword
24
}
25
26
# MYDB not created
27
if (-not (Test-Path $myDatabasePath)) {
28
$secretSalt = Get-Salt # from Crypto.psm1
29
$secretPassHash = Get-PasswordHash ($salt + $aSecret)
30
31
Invoke-Sqlcmd "CREATE DATABASE [`$(DATABASE_NAME)] CONTAINMENT = PARTIAL" `
32
-Variable ,"DATABASE_NAME=$myCustomDatabaseName" `
33
@commonArgs
34
Invoke-Sqlcmd -InputFile $myScriptPath `
35
-Variable ,"A_SECRET=$secretPassHash" `
36
@commonArgs
37
}
38
39
if ($args.Count -gt 0 {
40
Invoke-Expression $args
41
} else {
42
# Restart the SQL Server process so that the logs
43
# are written in the standard output file
44
Stop-Process -Name sqlservr -Force
45
Start-Process -FilePath /opt/mssql/bin/sqlservr -Wait
46
}
Copied!
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 :
PowerShell
Bash
1
docker container run -it `
2
# ...
3
mycorporation/workflowgen-sql:7.18.3-ubuntu-18.04 /usr/local/bin/customcode.ps1 pwsh
Copied!
1
docker container run -it \
2
# ...
3
mycorporation/workflowgen-sql:7.18.3-ubuntu-18.04 /usr/local/bin/customcode.ps1 pwsh
Copied!
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 :
PowerShell
Bash
1
Set-Location path/to/context-dir
2
docker container build `
3
-t mycorporation/workflowgen-sql:7.18.3-ubuntu-18.04 `
4
.
Copied!
1
cd path/to/context-dir
2
docker container build \
3
-t mycorporation/workflowgen-sql:7.18.3-ubuntu-18.04 \
4
.
Copied!

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, voir l'article Kubernetes Configure Liveness, Readiness and Startup Probes.
    *.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 1yr ago