[DOCKER] Configuration avec les données de test initiales insérées dans le conteneur Db2 / DB

Bonjour. Cette fois, je vais vous montrer comment configurer une base de données et insérer des données de test en douceur à l'aide du conteneur Db2 d'IBM.

Ce code est publié sur GitHub, veuillez donc vous y référer. https://github.com/rikkyrice/setup-db2-container

Aperçu

J'ai laissé tomber le conteneur Db2, mais Cette méthode est recommandée pour ceux qui souhaitent créer des tables et tester des données en arrière-plan au stade du démarrage.

L'article suivant explique comment supprimer le conteneur Db2, veuillez donc y jeter un œil. Configurer un conteneur DB2 DB et insérer un peu de données

Cet article est un dérivé de l'article ci-dessus et fournit des étapes pour créer un conteneur personnalisé.

Environnement de développement

supposition

Getting Started Permettez-moi de vous présenter. Je pense que le fonctionnement est le même pour Windows, Mac et Linux. J'ai aussi un environnement Mac à la maison, donc je l'ai essayé, mais cela a fonctionné sans difficulté.

1. Diverses préparations

Tout d'abord, préparez tout.

Structure du répertoire

/project


project
├─data
|    ├─users_insert.csv
|    ├─tweets_insert.csv
|    └─replys_insert.csv
├─sql
|   ├─users_create.sql
|   ├─tweets_create.sql
|   └─replys_create.sql
├─createschema.sh
├─Dockerfile
└─env.list

1.1. Télécharger l'image du conteneur

Enregistrez l'image du conteneur Db2 dans le référentiel local de docker. Exécutez la commande suivante.

$ docker pull ibmcom/db2:11.5.4.0

Vous n'avez pas besoin de quelqu'un qui l'a déjà téléchargé. La première fois prendra un certain temps.

Confirmez l'existence.

$ docker images
REPOSITORY               TAG                            IMAGE ID            CREATED             SIZE
ibmcom/db2               11.5.4.0                       d6b3abc02d57        3 months ago        2.69GB

Cette fois, nous utiliserons cette image de conteneur comme image de base.

1.2. Préparation du fichier d'informations de configuration

Lorsque vous exécutez le conteneur, vous devez charger les fichiers de configuration définis. Cela peut également être spécifié avec l'option -e, mais il est recommandé de le mettre dans un fichier car il est plus facile de gérer Git. J'ai préparé un échantillon ci-dessous.

La description de ce fichier est ici.

env.list


LICENSE=accept
DB2INSTANCE=db2inst1
DB2INST1_PASSWORD=password
DBNAME=USERDB
BLU=false
ENABLE_ORACLE_COMPATIBILITY=false
TO_CREATE_SAMPLEDB=false
PERSISTENT_HOME=true
HADR_ENABLED=false
ETCD_ENDPOINT=
ETCD_USERNAME=
ETCD_PASSWORD=

1.3 Préparation du fichier SQL

Cette fois, je préparerai les données en supposant la création d'une application tweet.

Une définition de tableau simple est ci-dessous.

utilisateur

** Tweet **

réponse

J'écrirai un fichier SQL basé sur la définition de table ci-dessus. Cette fois, je l'ai préparé avec le sentiment suivant.

users_create.sql


CREATE TABLE users (
    id VARCHAR(36) NOT NULL,
    name VARCHAR(40) NOT NULL,
    mail VARCHAR(100) NOT NULL,
    password VARCHAR(30) NOT NULL,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL,
    PRIMARY KEY (
        id
    )
);

tweets_create.sql


CREATE TABLE tweets (
    id VARCHAR(36) NOT NULL,
    user_id VARCHAR(36) NOT NULL,
    body VARCHAR(300),
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL,
    PRIMARY KEY (
        id
    ),

    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION
);

replys_create.sql


CREATE TABLE replys (
    id VARCHAR(36) NOT NULL,
    tweet_id VARCHAR(36) NOT NULL,
    user_id VARCHAR(36) NOT NULL,
    body VARCHAR(300),
    created_at TIMESTAMP NOT NULL,
    PRIMARY KEY (
        id
    ),

    FOREIGN KEY (tweet_id) REFERENCES tweets(id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION,
    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION
);

1.4. Préparation des données d'essai

Préparez les données de test. Vous pouvez également écrire l'instruction d'insertion dans le fichier SQL pour les données de test. La maintenance étant difficile, cette fois je l'écrirai dans un fichier CSV et l'insérerai.

Le fichier CSV à insérer est préparé ci-dessous.

users_insert.csv


hogeeee,hoge,[email protected],hogehoge,2020-10-09-12.00.00.000000,2020-10-09-12.00.00.000000
fugaaaa,fuga,[email protected],fugafuga,2020-10-10-12.00.00.000000,2020-10-10-12.00.00.000000

tweets_insert.csv


dba11ffb-b8e0-642d-bb1b-4c8053bdb4bd,hogeeee,C'est un test.,2020-10-09-12.00.00.000000,2020-10-09-12.00.00.000000
b193cb79-0e0c-85d9-2f0a-32d9774bb0aa,fugaaaa,C'est un test.,2020-10-10-12.00.00.000000,2020-10-10-12.00.00.000000

replys_insert.csv


7e3991a6-d3da-252f-f14f-cfed35a512a7,b193cb79-0e0c-85d9-2f0a-32d9774bb0aa,hogeeee,J'ai confirmé le test.,2020-10-11-12.00.00.000000
b2da92cf-6bd2-ac1c-618a-b36ef8eb94b1,dba11ffb-b8e0-642d-bb1b-4c8053bdb4bd,fugaaaa,J'ai confirmé le test.,2020-10-11-12.00.00.000000

On suppose que vous avez deux utilisateurs, chacun publiant un tweet pour le test, et chacun répondant à ce tweet.

1.5. Script shell

Je l'ai ajouté dans l'article ici, ibmcom / db2: 11.5.4.4 est dans les coulisses lorsque vous faites docker run Tout d'abord, le script shell / var / db2_setup / lib / setup_db2_instance.sh est exécuté. Ce script shell configure l'instance Db2 en fonction des informations d'environnement, et en même temps J'exécute un script shell appelé / var / db2_setup / include / db2_common_functions. Ce shell installe Db2. et enfin

setup_db2_instance.sh


#!/bin/bash

.....réduction.....

# If the /var/custom directory exists, run all scripts there. It is for products that build on top of our base image
if [[ -d /var/custom ]]; then
    echo "(*) Running user-provided scripts ... "
    for script in `ls /var/custom`; do
       echo "(*) Running $script ..."
       /var/custom/$script
    done
fi

.....réduction.....

Il y a une description, En d'autres termes, le script du répertoire / var / custom / à l'intérieur du conteneur est finalement appelé. Le script shell pour l'insertion de données est appelé ici pour effectuer les réglages initiaux.

Mais, Par défaut, / var / custom n'existe pas, vous devrez donc le créer vous-même. Cela sera introduit dans Création d'un fichier Docker ci-dessous.

Créons maintenant une table et écrivons un script shell qui émet des instructions pour insérer des données.

createschema.sh


#!/bin/bash

export PATH=/database/config/db2inst1/sqllib/bin/:$PATH

db2 connect to USERDB user db2inst1 using password

#Créer une table
db2 -tvf /var/custom/sql/users_create.sql
db2 -tvf /var/custom/sql/tweets_create.sql
db2 -tvf /var/custom/sql/replys_create.sql

#Insérer des données
db2 import from /var/custom/data/users_insert.csv of del insert into users
db2 import from /var/custom/data/tweets_insert.csv of del insert into tweets
db2 import from /var/custom/data/replys_insert.csv of del insert into replys

# Terminate
db2 terminate
touch /tmp/end.txt

Tout d'abord, je l'ai mis dans mon PATH pour pouvoir utiliser la commande db2. Ensuite, exécutez les fichiers SQL afin de créer la table déclarée ci-dessus.

Que signifie «db2 -tvf»?

Que signifie db2 import de $ {filename} de del insert dans $ {tablename}?

1.6. Préparation du Dockerfile

Enfin, créez un Dockerfile pour créer l'image de votre conteneur Db2 personnalisé.

Je pense qu'il y a différents paramètres, mais je vais le supprimer un peu et en faire un simple Dockerfile.

Là encore, la structure des répertoires du projet est la suivante.

/project


project
├─data
|    ├─users_insert.csv
|    ├─tweets_insert.csv
|    └─replys_insert.csv
├─sql
|   ├─users_create.sql
|   ├─tweets_create.sql
|   └─replys_create.sql
├─createschema.sh
├─Dockerfile
└─env.list

Dockerfile


FROM ibmcom/db2:11.5.4.0
RUN mkdir /var/custom
RUN mkdir /var/custom/sql
RUN mkdir /var/custom/data
COPY ./sql/*.sql /var/custom/sql/
COPY ./data/*.csv /var/custom/data/
COPY createschema.sh /var/custom/
RUN chmod 444 /var/custom/sql/*.sql
RUN chmod 444 /var/custom/data/*.csv
RUN chmod a+x /var/custom/createschema.sh

Tout d'abord, spécifiez le ʻibmcom / db2: 11.5.4.0` déposé comme image de base. Nous allons personnaliser ce conteneur.

En créant le répertoire / var / custom / comme déjà mentionné, Puisque le script spécifié ici est appelé pendant l'installation, faites mkdir. J'ai créé un répertoire dédié pour les fichiers sql et ainsi de suite.

Je vais y copier le fichier préparé. En outre, définissez les autorisations en lecture seule. createchema.sh doit exécuter le script shell, alors donnez-lui l'autorisation d'exécution.

Vous êtes maintenant prêt à créer votre image personnalisée.

2. Créez une image de conteneur personnalisée

Ensuite, créez une image de conteneur personnalisée à l'aide des éléments préparés. Tout le monde connaît «docker build».

Cette fois, nous ajouterons la balise test-db: v1.0 pour faciliter son identification.

$ docker build -t test-db:v1.0 .

Exécutez le répertoire où se trouve le Dockerfile. Je pense que cela prendra beaucoup de temps pour la première fois. Si vous avez un cache, cela prendra environ 1 seconde.

Vérifiez l'existence lorsque la construction est terminée.

$ docker images
REPOSITORY               TAG                            IMAGE ID            CREATED             SIZE
test-db                  v1.0                           186064b82d09        28 minutes ago      2.69GB

Tu peux le faire.

3. Exécution de conteneurs personnalisés

Lançons maintenant un conteneur personnalisé.

$ docker run --name test-db --restart=always --detach --privileged=true -p 50000 --env-file env.list test-db:v1.0

Le nom du conteneur est test-db, et la ʻenv.list` préparée est spécifiée pour les informations de configuration.

Quand je l'exécute, je crache juste l'ID du conteneur et je ne sais pas quand l'installation est terminée, alors je vais jeter un œil au journal.

$ docker logs -f test-db


SQL3109N  The utility is beginning to load data from file
"/var/custom/data/replys_insert.csv".
(*) Previous setup has not been detected. Creating the users...
(*) Creating users ...
(*) Creating instance ...
DB2 installation is being initialized.

 Total number of tasks to be performed: 4
Total estimated time for all tasks to be performed: 309 second(s)

Task #1 start
Description: Setting default global profile registry variables
Estimated time 1 second(s)
Task #1 end

Task #2 start
Description: Initializing instance list
Estimated time 5 second(s)
Task #2 end

Task #3 start
Description: Configuring DB2 instances
Estimated time 300 second(s)
Task #3 end

Task #4 start
Description: Updating global profile registry
Estimated time 3 second(s)
Task #4 end

The execution completed successfully.

.........réduction.........

SQL3110N  The utility has completed processing.  "2" rows were read from the
input file.

SQL3221W  ...Begin COMMIT WORK. Input Record Count = "2".

SQL3222W  ...COMMIT of any database changes was successful.

SQL3149N  "2" rows were processed from the input file.  "2" rows were
successfully inserted into the table.  "0" rows were rejected.


Number of rows read         = 2
Number of rows skipped      = 0
Number of rows inserted     = 2
Number of rows updated      = 0
Number of rows rejected     = 0
Number of rows committed    = 2

DB20000I  The TERMINATE command completed successfully.
(*) Running data ...
/var/db2_setup/lib/setup_db2_instance.sh: line 201: /var/custom/data: Is a directory
(*) Running sql ...
/var/db2_setup/lib/setup_db2_instance.sh: line 201: /var/custom/sql: Is a directory
          from "/database/data/db2inst1/NODE0000/SQL00001/LOGSTREAM0000/".

2020-10-10-01.35.55.270890+000 E239025E525           LEVEL: Event
PID     : 18622                TID : 140605766231808 PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000            DB   : USERDB
APPHDL  : 0-7                  APPID: *LOCAL.db2inst1.201010013552
AUTHID  : DB2INST1             HOSTNAME: 99a855c216d7
EDUID   : 22                   EDUNAME: db2agent (idle) 0
FUNCTION: DB2 UDB, base sys utilities, sqeLocalDatabase::FreeResourcesOnDBShutdown, probe:16544
STOP    : DATABASE: USERDB   : DEACTIVATED: NO

Je pense qu'un journal comme celui-ci sera craché.

En tant que drapeau de fin DB20000I The TERMINATE command completed successfully. Si vous voyez ce journal, la configuration est terminée.

Si vous revenez un peu en arrière pour créer le tableau,

CREATE TABLE users ( id VARCHAR(36) NOT NULL, name VARCHAR(40) NOT NULL, mail VARCHAR(100) NOT NULL, password VARCHAR(30) NOT NULL, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, PRIMARY KEY ( id ) )
DB20000I  The SQL command completed successfully.

S'il n'y a pas d'erreur, cela se termine normalement par "La commande SQL s'est terminée avec succès".

En ce qui concerne l'insertion de données, vous pouvez voir des journaux tels que Nombre de lignes validées = 2. Il s'agit d'un journal qui montre l'état des données insérées. Cette fois, «inséré = 2» et «rejeté = 0», donc tout est inséré normalement. Si c'est "rejeté = 2", alors deux insertions de données ont échoué et doivent être examinées.

Si vous faites une erreur ou si vous souhaitez l'exécuter à nouveau

#Suppression forcée du conteneur d'exécution
$ docker rm -f test-db
test-db

#Supprimer l'image du conteneur
$ docker rmi test-db:v1.0

Vous pouvez le supprimer proprement. Si vous souhaitez simplement réexécuter le conteneur, exécutez la commande ci-dessus, et si vous modifiez le fichier SQL ou Dockerfile, exécutez les commandes du haut et du bas.

Supplément

si,

/bin/bash^M: bad interpreter: No such file or directory

Si vous obtenez une erreur telle que, et createschema.sh n'est pas exécuté, Tapez la commande suivante dans un environnement où vous pouvez taper sed (tel que Git bash).

sed -i 's/\r//' createschema.sh

Lorsqu'un script shell enregistré dans un environnement Windows est exécuté dans un environnement Linux, Le code de saut de ligne peut être enregistré sous \ r \ n, et vous devez le changer en \ n sous Linux. Supprimez à nouveau le conteneur et réessayez.

4. Confirmation de l'existence des données insérées

Maintenant, vérifions si les données insérées sont correctement insérées avec la valeur attendue.

En fait, entrez dans le conteneur, connectez-vous à la base de données et tapez l'instruction SELECT.

$ docker exec -it test-db bash -c "su - db2inst1"
Last login: Sat Oct 10 01:46:02 UTC 2020
[db2inst1@99a855c216d7 ~]$ db2 connect to userdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.4.0
 SQL authorization ID   = DB2INST1
 Local database alias   = USERDB

[db2inst1@99a855c216d7 ~]$ db2 "select * from users"
ID                                   NAME                                     MAIL                                                                                                 PASSWORD                       CREATED_AT                 UPDATED_AT
------------------------------------ ---------------------------------------- ---------------------------------------------------------------------------------------------------- ------------------------------ -------------------------- --------------------------
hogeeee                              hoge                                     [email protected]                                                                                        hogehoge                       2020-10-09-12.00.00.000000 2020-10-09-12.00.00.000000
fugaaaa                              fuga                                     [email protected]                                                                                        fugafuga                       2020-10-10-12.00.00.000000 2020-10-10-12.00.00.000000

  2 record(s) selected.

[db2inst1@99a855c216d7 ~]$ 

Les données écrites dans le fichier csv sont insérées correctement. Pour sortir du conteneur, tapez ʻexit`.

Sommaire

Comment était-ce? C'est facile, mais j'ai présenté comment configurer avec des données insérées dans Db2. Cette image de conteneur peut être réutilisée, vous pouvez donc écrire un autre Dockerfile dans un autre projet et créer une autre image personnalisée immédiatement. Vous pouvez facilement créer une base de données qui répond aux spécifications du projet.

De plus, comme il est volatil, même si vous insérez des données, si vous le supprimez avec docker rm -f, il peut être facilement initialisé au prochain démarrage, il sera donc très facile à tester.

Je vais étudier comment faire fonctionner cette base de données avec une interface graphique à l'avenir.

J'écrirai également un article qui explique comment se connecter réellement à cette base de données et manipuler les données en utilisant le langage Go.

Références

Recommended Posts

Configuration avec les données de test initiales insérées dans le conteneur Db2 / DB
[Rails] Création initiale des données avec seed
[Rails] Entrée de données initiale avec seed_fu!
Contrôler l'ordre de test dans Junit4 avec un type d'énumération
Un script qui crée yaml à partir de CSV pour mettre les données initiales dans Rails with Fixtures
Testez le contrôleur avec Mock MVC dans Spring Boot
Démarrez SQL Server avec Docker et enregistrez les données initiales
Lancer l'image Docker avec les données initiales injectées avec docker-compose
Visualisez la méthode de test en cours d'exécution dans TestNG dans l'écouteur