Le but de ce tutorial est de mettre en place un environnement de base.

On va donc installer les bases:

  • Une base de donnée (PostgreSQL)
  • Un FlexLM
  • Un ConfigServer
  • Un GAX

Ce tutorial ne couvrera pas l’installation des programmes docker et docker-compose qui seront utilisés. Pour cela vous pouvez suivre les instructions d’installation de ceux-ci:

Toutes les sources de tutorial sont disponible sur github.

La structure de base de notre projet se composera de différents fichiers et dossiers :

  • docker-compose.yml: Fichier qui contient la structure de notre ensemble de container
  • build: Les espaces de construction des différents containers (un par container)
  • source: Les différents package d’installation Genesys
  • config: Les fichiers de configuration comme les licenses et des fichiers .env contentant les variables d’environnement qui vont initialiser les différents containers
  • script: Des scripts commun à différent container
  • data: Contiendra les données des containers en cours de fonctionnement.

Pour commencer, il nous faut récuperer les packages d’installation à partir du site de Genesys et les déposer dans le dossier ./source.

Ce tutorial peut être long. Si vous souhaitez simplement tester, allez directement à la fin

La base de donnée

Notre configuration docker-compose:

  database:
    hostname: database
    build:
      context: .
      dockerfile: build/postgres/Dockerfile  
      args:
        LCA_VERSION: "8510029b1_ENU"
    image: genesys-postgres
    restart: always
    env_file:
      - ./config/database.env
    volumes:
      - "./data/postgresql:/var/lib/postgresql/data"

Nous allons modifier un peu le container de base de PostgreSQL afin d’injecter et de le superviser avec LCA.

Le fichier Dockerfile de construction de notre container (build/postgres/Dockerfile)::

FROM centos as build-lca
ARG  LCA_VERSION=8510029b1_ENU
#Add 32 bit support to centos (Needed for install script)
RUN yum install -y glibc.i686 && yum clean all && rm -rf /var/cache/yum

ADD source/IP_LCA_${LCA_VERSION}_linux.tar.gz /source/lca

COPY build/lca/genesys_silent.ini  /source/lca/ip/genesys_silent.ini

WORKDIR /source/lca/ip
RUN ./install.sh -s -fr /source/lca/ip/genesys_silent.ini -fl /source/lca/ip/genesys_install_result.log; cat /source/lca/ip/genesys_install_result.log

FROM postgres

COPY --from=build-lca /gcti/lca /gcti/lca

RUN mkdir -p /docker-entrypoint-initdb.d \
 && echo '(cd /gcti/lca && nohup /gcti/lca/lca 4999 &)' > /docker-entrypoint-initdb.d/lca.sh \
 && chmod +x /docker-entrypoint-initdb.d/lca.sh && chmod 777 /gcti/lca/lca

La construction du container se déroule en deux phases:

  • L’installation de LCA (se base sur la config dans build/lca/genesys_silent.ini)
  • La mise en place de LCA dans PostgreSQL

Afin de valider notre container:

Contruire notre container:
docker-compose build database
Lancer notre container:
docker-compose up -d database
Suivre les logs:
docker-compose logs -f database

FlexLM

Notre configuration docker-compose:

  flexlm:
    hostname: flexlm
    #mac_address: 00:00:00:00:00:00
    build:
      context: .
      dockerfile: build/flexlm/Dockerfile
      args:
        LCA_VERSION: "8510029b1_ENU"
    image: genesys-flexlm
    restart: always
    volumes:
      - "./config/license.dat:/run/secrets/license.dat:ro"

Le fichier Dockerfile de construction de notre container (build/flexlm/Dockerfile):

FROM centos as build-lca
ARG  LCA_VERSION=8510029b1_ENU
#Add 32 bit support to centos (Needed for install script)
RUN yum install -y glibc.i686 && yum clean all && rm -rf /var/cache/yum

ADD source/IP_LCA_${LCA_VERSION}_linux.tar.gz /source/lca

COPY build/lca/genesys_silent.ini  /source/lca/ip/genesys_silent.ini

WORKDIR /source/lca/ip
RUN ./install.sh -s -fr /source/lca/ip/genesys_silent.ini -fl /source/lca/ip/genesys_install_result.log; cat /source/lca/ip/genesys_install_result.log

FROM centos
#RUN yum update -y \
# && yum install -y glibc.i686 redhat-lsb-core redhat-lsb.i686-core libgcc_s.so.1 \
# && yum clean all && rm -rf /var/cache/yum
RUN yum install -y glibc.i686 redhat-lsb-core redhat-lsb.i686-core libgcc libgcc_s.so.1 glibc \
 && yum clean all && rm -rf /var/cache/yum

RUN ln -s /lib/ld-linux.so.2 /lib/ld-lsb.so.3

COPY --from=build-lca /gcti/lca /gcti/lca
COPY build/flexlm/entrypoint.sh /entrypoint.sh

COPY script /gcti/script

ADD source/lmgr11.13-i686-linux-rhe4.tar /gcti/flexlm
RUN chown -R nobody:nobody /gcti/flexlm /gcti/lca
WORKDIR /gcti/flexlm

USER nobody

ENTRYPOINT ["/entrypoint.sh"]
#CMD ["su", "nobody", "-c", "./lmgrd", "-c", "/gcti/flexlm/license.dat"]
CMD ["./lmgrd", "-z", "-c", "/gcti/flexlm/license.dat"]
EXPOSE 7260/tcp

Afin de valider notre container:

Contruire notre container:
docker-compose build flexlm
Lancer notre container:
docker-compose up -d flexlm
Suivre les logs:
docker-compose logs -f flexlm

Config server

Notre configuration docker-compose:

  cfg:
    hostname: cfg
    depends_on:
      - database
    build:
      context: .
      dockerfile: build/cfg/Dockerfile
      args:
        LCA_VERSION: "8510029b1_ENU"
        CFG_VERSION: "8510128b1_ENU"
    image: genesys-cfg
    restart: always
    env_file:
      - ./config/database.env
      - ./config/cfg.env
#    ports:
#      - 2020:2020
#      - 2021:2021
#Only export port on trusted network

Le fichier Dockerfile de construction de notre container (build/cfg/Dockerfile):

FROM centos as build-lca
ARG  LCA_VERSION=8510029b1_ENU
#Add 32 bit support to centos (Needed for install script)
RUN yum install -y glibc.i686 glibc && yum clean all && rm -rf /var/cache/yum

ADD source/IP_LCA_${LCA_VERSION}_linux.tar.gz /source/lca

COPY build/lca/genesys_silent.ini  /source/lca/ip/genesys_silent.ini

WORKDIR /source/lca/ip
RUN ./install.sh -s -fr /source/lca/ip/genesys_silent.ini -fl /source/lca/ip/genesys_install_result.log; cat /source/lca/ip/genesys_install_result.log

FROM centos as build-env
ARG  CFG_VERSION=8510128b1_ENU
#Add 32 bit support to centos
RUN yum install -y glibc.i686 glibc && yum clean all && rm -rf /var/cache/yum

ADD source/IP_ConfigServer_${CFG_VERSION}_linux.tar.gz /source/cfg

COPY build/cfg/genesys_silent.ini  /source/cfg/ip/genesys_silent.ini

WORKDIR /source/cfg/ip
RUN ./install.sh -s -fr /source/cfg/ip/genesys_silent.ini -fl /source/cfg/ip/genesys_install_result.log \
 ;  cat /source/cfg/ip/genesys_install_result.log

FROM centos

#Install pgsql dep
RUN yum install -y postgresql nmap-ncat && yum clean all && rm -rf /var/cache/yum

COPY --from=build-lca /gcti/lca /gcti/lca
COPY --from=build-env /gcti/cfg /gcti/cfg
COPY build/cfg/entrypoint.sh /entrypoint.sh

COPY script /gcti/script

WORKDIR /gcti/cfg

ENTRYPOINT ["/entrypoint.sh"]
CMD ["./confserv"]
EXPOSE 2020/tcp
EXPOSE 2021/tcp

Dans ce container, on a un peu plus de spécificté pour le démarrage afin de lancer la configuration de la base de donnée au démarrage (build/cfg/entrypoint.sh):

#!/bin/sh

. /gcti/script/network.sh
. /gcti/script/postgres.sh
. /gcti/script/lca.sh

# Start LCA
Genesys_Start_LCA 4999

Wait_For_Port "$DB_HOST" "$DB_PORT" "database ($DB_TYPE)"

sleep 3

if [ "$DB_TYPE" = "postgre" ]; then
  Create_Postgres_Database "$DB_HOST" "$DB_PORT" "$DB_USER" "$DB_PASS" "$DB_NAME"

  echo "Start-up: Checking pgsql database $DB_NAME for table 'cfg_locale'"
  if psql -c "SELECT to_regclass('cfg_locale');" | grep cfg_locale; then
    echo "Start-up: Database $DB_NAME already init -> doing nothing"
  else
    echo "Start-up: Init Database $DB_NAME"
    psql --single-transaction --echo-all --file=/gcti/cfg/sql_scripts/postgre/init_multi_postgre.sql
    psql --single-transaction --echo-all --file=/gcti/cfg/sql_scripts/postgre/CfgLocale_postgre.sql
    ENC_PASS=$(echo -n "$DEFAULT_PASSWORD" | md5sum | awk '{ print $1 }')
    #echo "Start-up: Init Default password: '$DEFAULT_PASSWORD' '${ENC_PASS^^}'"
    psql -c "UPDATE cfg_person SET password='${ENC_PASS^^}' , salted_string=NULL WHERE dbid=100;"
  fi
fi

sed -i 's/Password=default/Password='$DEFAULT_PASSWORD'/g' /gcti/cfg/confserv.conf
#Run prog in arg
exec $*

Ceci script de démarrage modifie aussi le mot de passe du compte administrateur.

Afin de valider notre container:

Contruire notre container:
docker-compose build cfg
Lancer notre container:
docker-compose up -d cfg
Suivre les logs:
docker-compose logs -f cfg

GAX

Notre configuration docker-compose:

  gax:
    hostname: gax
    depends_on:
      - cfg
    build:
      context: .
      dockerfile: build/gax/Dockerfile      
      args:
        GAX_VERSION: "9000015b1_ENU"
        LCA_VERSION: "8510029b1_ENU"
    image: genesys-gax
    restart: always
    env_file:
      - ./config/database.env
      - ./config/cfg.env
      - ./config/gax.env
#    ports:
#      - "8080:8080"
#Only export port on trusted network

Le fichier Dockerfile de construction de notre container (build/gax/Dockerfile):

FROM centos as build-lca
ARG  LCA_VERSION=8510029b1_ENU
#Add 32 bit support to centos (Needed for install script)
RUN yum install -y glibc.i686 && yum clean all && rm -rf /var/cache/yum

ADD source/IP_LCA_${LCA_VERSION}_linux.tar.gz /source/lca

COPY build/lca/genesys_silent.ini  /source/lca/ip/genesys_silent.ini

WORKDIR /source/lca/ip
RUN ./install.sh -s -fr /source/lca/ip/genesys_silent.ini -fl /source/lca/ip/genesys_install_result.log; cat /source/lca/ip/genesys_install_result.log

FROM centos as build-env
ARG  GAX_VERSION=9000015b1_ENU

#Install java
RUN yum install -y java-1.8.0-openjdk-headless && yum clean all && rm -rf /var/cache/yum
#Add 32 bit support to centos (Needed for install script)
RUN yum install -y glibc.i686 && yum clean all && rm -rf /var/cache/yum

ADD source/IP_GAX_${GAX_VERSION}_linux.tar.gz /source/gax

COPY build/gax/genesys_silent.ini  /source/gax/ip/genesys_silent.ini

WORKDIR /source/gax/ip
#Fix os version compat
RUN echo "CentOS release 7 (Core)" > /etc/redhat-release
RUN JRE_HOME=$(echo /usr/lib/jvm/java-*/jre) ./install.sh -s -fr /source/gax/ip/genesys_silent.ini -fl /source/gax/ip/genesys_install_result.log; cat /source/gax/ip/genesys_install_result.log

FROM centos
#Install java
RUN yum install -y java-1.8.0-openjdk-headless && yum clean all && rm -rf /var/cache/yum
RUN yum install -y postgresql nc && yum clean all && rm -rf /var/cache/yum
RUN curl -L --output /usr/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && chmod +x /usr/bin/jq

COPY --from=build-lca /gcti/lca /gcti/lca
COPY --from=build-env /gcti/gax /gcti/gax
COPY --from=build-env /source/gax/templates /source/gax/templates
COPY build/gax/entrypoint.sh /entrypoint.sh

COPY script /gcti/script

WORKDIR /gcti/gax

VOLUME /gcti/gax/conf
#TODO volume log ? now only on stdout
ENTRYPOINT ["/entrypoint.sh"]
CMD ["/gcti/gax/gax_startup.sh", "-immediate"]
EXPOSE 8080/tcp
#By default https is deactived
#EXPOSE 8443/tcp

Le fichier de demarrage du container, si necessaire, va créer la base de donnée de GAX et le configurer au près du configserver (build/gax/entrypoint.sh).

Afin de valider notre container (toujours les même commandes):

Contruire notre container:
docker-compose build gax
Lancer notre container:
docker-compose up -d gax
Suivre les logs:
docker-compose logs -f gax

Pour récuperer l’information sur l’ip du container GAX :

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-lab-genesys_gax_1

Vistez l’url http://IP_CONTAINER_GAX:8080/gax opur valider le fonctionnement du gax fraichement installé.

Lancement rapide

Si vous souhaitez executer rapidement ce tutorial, il suffit de simplement prendre la code source sur github et les packages de Genesys et de le lancer avec docker-compose.

git clone --branch base https://github.com/sapk/docker-lab-genesys
cd docker-lab-genesys
#Copier les package Genesys Red-Hat .tar.gz dans ./source
docker-compose up -d gax
#Attendre que tous s'installe avec 
docker-compose logs -f
#Visiter l'url du GAX:
echo "http://$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' docker-lab-genesys_gax_1):8080/gax"

Vous voila avec une simple instance démarrable rapidement.