[DOCKER] Setup mit anfänglichen Testdaten, die in den Db2 / DB-Container eingefügt wurden

Hallo. Dieses Mal werde ich Ihnen zeigen, wie Sie mithilfe des IBM Db2-Containers eine Datenbank einrichten und Testdaten reibungslos einfügen.

Dieser Code wird auf GitHub veröffentlicht. Bitte beziehen Sie sich darauf. https://github.com/rikkyrice/setup-db2-container

Überblick

Ich habe den Db2-Container fallen lassen, aber Diese Methode wird für diejenigen empfohlen, die beim Start Tabellen erstellen und Daten im Hintergrund testen möchten.

Der folgende Artikel beschreibt, wie Sie den Db2-Container löschen. Schauen Sie also bitte mal rein. Richten Sie einen Db2-DB-Container ein und fügen Sie ein paar Daten ein

Dieser Artikel ist eine Ableitung des obigen Artikels und enthält Schritte zum Erstellen eines benutzerdefinierten Containers.

Entwicklungsumgebung

Annahme

Getting Started Lass mich dich vorstellen. Ich denke, dass der Vorgang für Windows, Mac und Linux gleich ist. Ich habe auch eine Mac-Umgebung zu Hause, also habe ich es versucht, aber es hat ohne Schwierigkeiten funktioniert.

1. Verschiedene Vorbereitungen

Bereiten Sie zunächst alles vor.

Verzeichnisaufbau

/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. Container-Image herunterladen

Speichern Sie das Db2-Container-Image im lokalen Repository des Dockers. Führen Sie den folgenden Befehl aus.

$ docker pull ibmcom/db2:11.5.4.0

Sie brauchen niemanden, der es bereits heruntergeladen hat. Das erste Mal wird einige Zeit dauern.

Bestätige die Existenz.

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

Dieses Mal werden wir dieses Container-Image als Basis-Image verwenden.

1.2 Vorbereitung der Konfigurationsinformationsdatei

Wenn Sie den Container ausführen, müssen Sie die definierten Konfigurationsdateien laden. Dies kann auch mit der Option -e angegeben werden. Es wird jedoch empfohlen, es in eine Datei einzufügen, da es einfacher ist, Git zu verwalten. Ich habe unten ein Beispiel vorbereitet.

Die Beschreibung dieser Datei lautet hier.

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 Vorbereitung der SQL-Datei

Dieses Mal werde ich die Daten unter der Annahme vorbereiten, dass eine Tweet-Anwendung erstellt wird.

Eine einfache Tabellendefinition finden Sie unten.

Nutzer

** Tweet **

Antworten

Ich werde eine SQL-Datei basierend auf der obigen Tabellendefinition schreiben. Dieses Mal habe ich es mit dem folgenden Gefühl vorbereitet.

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 Vorbereitung der Testdaten

Bereiten Sie die Testdaten vor. Sie können die insert-Anweisung auch für die Testdaten in die SQL-Datei schreiben. Da die Wartung schwierig ist, werde ich sie diesmal in eine CSV-Datei schreiben und einfügen.

Die einzufügende CSV-Datei wird unten vorbereitet.

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,Dies ist ein Test.,2020-10-09-12.00.00.000000,2020-10-09-12.00.00.000000
b193cb79-0e0c-85d9-2f0a-32d9774bb0aa,fugaaaa,Dies ist ein 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,Ich habe den Test bestätigt.,2020-10-11-12.00.00.000000
b2da92cf-6bd2-ac1c-618a-b36ef8eb94b1,dba11ffb-b8e0-642d-bb1b-4c8053bdb4bd,fugaaaa,Ich habe den Test bestätigt.,2020-10-11-12.00.00.000000

Es wird davon ausgegangen, dass Sie zwei Benutzer haben, die jeweils einen Tweet zum Testen veröffentlichen und jeweils auf diesen Tweet antworten.

1.5. Shell-Skript

Ich habe es im Artikel hier hinzugefügt. ibmcom / db2: 11.5.4.4 ist hinter den Kulissen, wenn Sie "Docker Run" ausführen Zunächst wird das Shell-Skript / var / db2_setup / lib / setup_db2_instance.sh ausgeführt. Dieses Shell-Skript konfiguriert die Db2-Instanz basierend auf den Umgebungsinformationen und gleichzeitig Ich führe ein Shell-Skript mit dem Namen "/ var / db2_setup / include / db2_common_functions" aus. Diese Shell richtet Db2 ein. Und schlussendlich

setup_db2_instance.sh


#!/bin/bash

.....Kürzung.....

# 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

.....Kürzung.....

Es gibt eine Beschreibung, Mit anderen Worten, das Skript im Verzeichnis / var / custom / im Container wird schließlich aufgerufen. Hier wird das Shell-Skript zum Einfügen von Daten aufgerufen, um die Grundeinstellungen vorzunehmen.

Aber, Standardmäßig ist / var / custom nicht vorhanden, daher müssen Sie es selbst erstellen. Dies wird im Folgenden unter Erstellen einer Docker-Datei beschrieben.

Erstellen wir nun eine Tabelle und schreiben ein Shell-Skript, das Anweisungen zum Einfügen von Daten ausgibt.

createschema.sh


#!/bin/bash

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

db2 connect to USERDB user db2inst1 using password

#Tabelle erstellen
db2 -tvf /var/custom/sql/users_create.sql
db2 -tvf /var/custom/sql/tweets_create.sql
db2 -tvf /var/custom/sql/replys_create.sql

#Daten einfügen
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

Zuerst habe ich es in meinen PATH eingefügt, damit ich den Befehl db2 verwenden kann. Führen Sie dann die SQL-Dateien aus, um die oben deklarierte Tabelle zu erstellen.

Was bedeutet "db2 -tvf"?

Was bedeutet "db2-Import aus $ {Dateiname} von del insert in $ {Tabellenname}"?

1.6 Vorbereitung der Docker-Datei

Erstellen Sie abschließend eine Docker-Datei, um das Image Ihres benutzerdefinierten Db2-Containers zu erstellen.

Ich denke, es gibt verschiedene Einstellungen, aber ich werde es einiges entfernen und es zu einer einfachen Docker-Datei machen.

Auch hier ist die Verzeichnisstruktur des Projekts wie folgt.

/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

Geben Sie zunächst das abgelegte "ibmcom / db2: 11.5.4.0" als Basis-Image an. Wir werden diesen Container anpassen.

Durch Erstellen des Verzeichnisses / var / custom / wie bereits erwähnt, Da das dort angegebene Skript während des Setups aufgerufen wird, führen Sie mkdir aus. Ich habe ein dediziertes Verzeichnis für SQL-Dateien erstellt und so weiter.

Ich werde die vorbereitete Datei dort kopieren. Setzen Sie die Berechtigungen außerdem auf schreibgeschützt. createschema.sh muss das Shell-Skript ausführen, geben Sie ihm also die Ausführungsberechtigung.

Jetzt können Sie Ihr benutzerdefiniertes Image erstellen.

2. Erstellen Sie ein benutzerdefiniertes Container-Image

Erstellen Sie als Nächstes ein benutzerdefiniertes Containerbild mit den vorbereiteten Elementen. Jeder kennt "Docker Build".

Dieses Mal fügen wir das Tag "test-db: v1.0" hinzu, um die Identifizierung zu erleichtern.

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

Führen Sie das Verzeichnis aus, in dem sich die Docker-Datei befindet. Ich denke, es wird zum ersten Mal lange dauern. Wenn Sie einen Cache haben, dauert es ungefähr 1 Sekunde.

Überprüfen Sie die Existenz, wenn der Build abgeschlossen ist.

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

Du kannst es schaffen.

3. Benutzerdefinierte Containerausführung

Starten wir nun einen benutzerdefinierten Container.

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

Der Containername lautet "test-db", und die vorbereitete "env.list" wird für die Konfigurationsinformationen angegeben.

Wenn ich es ausführe, spucke ich einfach die Container-ID aus und weiß nicht, wann das Setup abgeschlossen ist. Ich werde mir das Protokoll ansehen.

$ 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.

.........Kürzung.........

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

Ich denke, dass ein Protokoll wie dieses ausgespuckt wird.

Als Endflagge DB20000I The TERMINATE command completed successfully. Wenn Sie dieses Protokoll sehen, ist die Einrichtung abgeschlossen.

Wenn Sie ein wenig zurückgehen, um die Tabelle zu erstellen,

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.

Wenn keine Fehler vorliegen, endet dies normalerweise mit "Der SQL-Befehl wurde erfolgreich abgeschlossen".

In Bezug auf das Einfügen von Daten sehen Sie Protokolle wie "Anzahl der festgeschriebenen Zeilen = 2". Dies ist ein Protokoll, das den Status der eingefügten Daten anzeigt. Diesmal "eingefügt = 2" und "abgelehnt = 0", sodass alles normal eingefügt wird. Wenn dies "abgelehnt = 2" ist, sind zwei Dateneinfügungen fehlgeschlagen und müssen untersucht werden.

Wenn Sie einen Fehler machen oder ihn erneut ausführen möchten

#Erzwungenes Löschen des Ausführungscontainers
$ docker rm -f test-db
test-db

#Containerbild löschen
$ docker rmi test-db:v1.0

Sie können es sauber löschen. Wenn Sie den Container nur erneut ausführen möchten, führen Sie den obigen Befehl aus. Wenn Sie die SQL-Datei oder die Docker-Datei ändern, führen Sie sowohl den oberen als auch den unteren Befehl aus.

Ergänzung

wenn,

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

Wenn Sie eine Fehlermeldung erhalten, z. B. und createschema.sh nicht ausgeführt wird, Geben Sie den folgenden Befehl in einer Umgebung ein, in der Sie sed eingeben können (z. B. Git bash).

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

Wenn ein in einer Windows-Umgebung gespeichertes Shell-Skript in einer Linux-Umgebung ausgeführt wird, Der Zeilenvorschubcode wird möglicherweise als \ r \ n gespeichert, und Sie müssen ihn unter Linux in \ n ändern. Löschen Sie nun den Container erneut und versuchen Sie es erneut.

4. Bestätigung des Vorhandenseins der eingefügten Daten

Lassen Sie uns nun überprüfen, ob die eingefügten Daten mit dem erwarteten Wert richtig eingefügt wurden.

Geben Sie den Container tatsächlich ein, stellen Sie eine Verbindung zur Datenbank her und geben Sie die SELECT-Anweisung ein.

$ 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 ~]$ 

Die in die CSV-Datei geschriebenen Daten werden ordnungsgemäß eingefügt. Um aus dem Container auszusteigen, geben Sie "exit" ein.

Zusammenfassung

Wie war es? Es ist einfach, aber ich habe das Einrichten mit in Db2 eingefügten Daten vorgestellt. Dieses Container-Image kann wiederverwendet werden, sodass Sie eine weitere Docker-Datei in ein anderes Projekt schreiben und sofort ein anderes benutzerdefiniertes Image erstellen können. Sie können problemlos eine Datenbank erstellen, die den Spezifikationen des Projekts entspricht.

Da es flüchtig ist, kann es beim nächsten Start leicht initialisiert werden, selbst wenn Sie Daten einfügen, wenn Sie es mit "docker rm -f" löschen, sodass es sehr einfach zu testen ist.

Ich werde untersuchen, wie diese Datenbank in Zukunft mit GUI betrieben werden kann.

Ich werde auch einen Artikel schreiben, in dem erklärt wird, wie man tatsächlich eine Verbindung zu dieser Datenbank herstellt und Daten mit der Sprache Go bearbeitet.

Verweise

Recommended Posts

Setup mit anfänglichen Testdaten, die in den Db2 / DB-Container eingefügt wurden
[Rails] Erste Datenerstellung mit Seed
[Rails] Erste Dateneingabe mit seed_fu!
Steuern Sie die Testreihenfolge in Junit4 mit einem Aufzählungstyp
Ein Skript, das Yaml aus CSV erstellt, um Anfangsdaten in Rails with Fixtures einzufügen
Testen Sie den Controller mit Mock MVC im Spring Boot
Starten Sie SQL Server mit Docker und registrieren Sie die Anfangsdaten
Starten Sie das Docker-Image mit den Anfangsdaten, die mit Docker-Compose eingefügt wurden
Visualisieren Sie die in TestNG ausgeführte Testmethode im Listener