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
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é.
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é.
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
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.
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=
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
);
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.
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}
?
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.
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.
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.
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.
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`.
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.
Recommended Posts