Getting Started with Genero Container Images

Welcome to your guide to deploying Genero Applications using Genero Containers.

Genero Container Images are created to optimize the deployment and runtime of your Genero application in any Docker environment. With Genero Containers, your team gets simplified app deployment and rollback procedures, continuous integration and deployment (CI/CD), automated testing and infrastructure-as-code(IaC) approaches. Our images are built to run your app directly on Docker or on an advanced Kubernetes environment making your app highly available, scalable, resilient and secure.

This guide will help you get a jump start on creating a Genero Runtime container, containerizing your own Genero application, and adding custom configurations to your container instances on Docker.

Genero Container Images

We are currently providing several types of Genero Container Images that can mainly be split into 2 categories: Runtime Images and Build Images.

All the Genero Container Runtime images contain Genero Business Development Language runtime (abbreviated as BDL and also referred to as FGL/FGLGWS throughout this doc) and Genero Application Server (abbreviated as GAS throughout this doc). Additionally, we have derivative images that additionally include Genero Report Writer (GRE) runtime and database clients. For examples: genero/enterprise/runtime and genero/enterprise/runtime-gre.

Build images, also referred to as development images, contain Genero Business Development Language runtime and the Genero Studio Server (GSTSRV). These images also include packages and tools that enable the build of a Genero application. For example genero/enterprise/development-build-gar.

The images are located in an Amazon registry known as AWS ECR. This is a private registry with restricted access. For more info, check the Prerequisites section in this guide.

Some images support multiple architectures: ARM and x86-64. Pulling an image like this will automatically resolve to the version compatible with your system during the pull process.

Here’s the list of the latest Genero Container Images (GCI) we provide:
Image Short Name Description ECR Name Products Versions
genero/enterprise/runtime

This image lets you deploy a container running a Genero Application Server (GAS).

OS/Arch: Linux® Rocky9, x86-64, ARM

Note that these images provide FGLGWS and GAS, but DO NOT include GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime:rl9-gas5.01.02-fgl5.01.02
  • gas 5.01.02
  • fgl 5.01.02
genero/enterprise/runtime-gre

This image lets you deploy a container running a Genero Application Server.

OS/Arch: Linux Rocky9, x86-64, ARM

Note that these images provide FGLGWS, GAS and GRE.
567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-gre:rl9-gas5.01.02-fgl5.01.02-gre5.01.00
  • gas 5.01.02
  • fgl 5.01.02
  • gre 5.01.00
genero/enterprise/runtime-mysql

Run a Genero Application Server (GAS) that supports connection to a MySQL database.

OS/Arch: Linux Rocky9, x86-64, ARM

Note that these images provide FGLGWS and GAS, but DO NOT include GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-mysql:rl9-gas5.01.02-fgl5.01.02-mysql8.0.42
  • gas 5.01.02
  • fgl 5.01.02
  • mysql 8.0.42
genero/enterprise/runtime-gre-mysql Run a Genero Application Server (GAS) that supports connection to a MySQL database.

OS/Arch: Linux Rocky9, x86-64, ARM

Note that these images provide FGLGWS, GAS and GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-gre-mysql:rl9-gas5.01.02-fgl5.01.02-mysql8.0.42
  • gas 5.01.02
  • fgl 5.01.02
  • gre 5.01.00
  • mysql 8.0.42
genero/enterprise/runtime-psql

Run a Genero Application Server (GAS) that supports connection to a Postgresql Database.

OS/Arch: Linux Rocky9, x86-64, ARM

Note that these images provide FGLGWS and GAS, but DO NOT include GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-psql:rl9-gas5.01.02-fgl5.01.02-psql16
  • gas 5.01.02
  • fgl 5.01.02
  • psql 16
genero/enterprise/runtime-gre-psql

Run a Genero Application Server (GAS) that supports connection to a Postgresql Database.

OS/Arch: Linux Rocky9, x86-64, ARM

Note that these images provide FGLGWS, GAS and GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-gre-psql:rl9-gas5.01.02-fgl5.01.02-psql16
  • gas 5.01.02
  • fgl 5.01.02
  • gre 5.01.00
  • psql 16
genero/enterprise/runtime-ifx

Run a Genero Application Server (GAS) that supports connection to an Informix® Database.

OS/Arch: Linux Rocky9, x86-64

Note that these images provide FGLGWS and GAS, but DO NOT include GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-ifx:rl9-gas5.01.02-fgl5.01.02-ifx4.50.FC1
  • gas 5.01.02
  • fgl 5.01.02
  • ifx 4.50.FC1
genero/enterprise/runtime-gre-ifx

Run a Genero Application Server (GAS) that supports connection to an Informix Database.

OS/Arch: Linux Rocky9, x86-64

Note that these images provide FGLGWS, GAS and GRE.
567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-gre-ifx:rl9-gas5.01.02-fgl5.01.02-gre5.01.00-ifx4.50.FC1
  • gas 5.01.02
  • fgl 5.01.02
  • gre 5.01.00
  • ifx 4.50.FC1
genero/enterprise/runtime-mssql

Run a Genero Application Server that supports connection to Microsoft® SQL Database.

OS/Arch: Linux Rocky9, x86-64

Note that these images provide FGLGWS and GAS, but DO NOT include GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-microsoftsql:rl9-gas5.01.02-fgl5.01.02-mssql17.10.0001.1Linux
  • gas 5.01.02
  • fgl 5.01.02
  • mssql 17
genero/enterprise/runtime-gre-mssql

Run a Genero Application Server that supports connection to Microsoft SQL Database.

OS/Arch: Linux Rocky9, x86-64

Note that these images provide FGLGWS, GAS and GRE.

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-microsoftsql:rl9-gas5.01.02-fgl5.01.02-gre5.01.00-mssql17.10.0001.1Linux
  • gas 5.01.02
  • fgl 5.01.02
  • gre 5.01.00
  • mssql 17
genero/enterprise/development-build-gar

This image lets you build a Genero Application into a GAR file. It comes with a Genero Studio (GST) Server installed which enables it to build Genero projects.

OS/Arch: Linux Rocky 9, x86-64

567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/development-build-gar:5.01
  • fgl 5.01.02
  • gst-srv 5.01.02
Note:

Ask your support team for more versions of the GCI (4.01 and 3.21 are available).

Starting a Genero Runtime Container

Prerequisites

Before starting, there is a set of tools and configurations that are required for this guide:
  • Install Docker Desktop (or any other Docker Daemon)
  • AWS tools
  • AWS keys - These keys grant you access to download (docker pull) the images listed in the table above only:
    • Request access keys from your support team.
    • You should get a set of 2 keys: Access and secret key.
    • Run aws config and set the user's access keys and region:
      aws configure
      AWS Access Key ID: XXXXXXXXXXXXXXXXXXXXX 
      AWS Secret Access Key: XXXXXXXXXXXXXXXXXXXXX
      Default region name [eu-west-2]: eu-west-2
    • To test your keys, run this command:
      aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 567640560273.dkr.ecr.eu-west-2.amazonaws.com
      You should get: Login Succeeded.
  • Genero Containers standalone license:
    • Request a license from your support team.

Start a Genero Runtime Container

When you pull an image from the private ECR, ensure that your AWS access keys are configured and that you are logged into the repo.

To log in, run the following command:

aws ecr get-login-password --region eu-west-2 | docker login --username AWS --password-stdin 567640560273.dkr.ecr.eu-west-2.amazonaws.com
  1. To pull the latest Genero Container Runtime image, run the following:
    export IMAGE_NAME=567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime:latest
    docker pull $IMAGE_NAME
  2. Run the following command to start one Runtime Container via Docker:
    docker run -it --privileged --rm --name genero-container -p 8080:80 -e FGL_LICENSE_NUMBER=<FGL LICENSE> -e FGL_LICENSE_KEY=<FGL_KEY> IMAGE_NAME
    To set your license, set the following environment variables for your container:
    • FGL_LICENSE_NUMBER: Genero runtime license number.
    • FGL_LICENSE_KEY: Genero runtime license key.
  3. (Optional) Start a Runtime Container via docker-compose. Here's an example of a docker-compose manifest that you can use to start one Genero Container:
    services:
      genero-container:
        ports:
        - '8080:80'
        image: "567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime:latest"
        restart: always
        environment:
        # FGL License
        - FGL_LICENSE_NUMBER=<FGL License Number>
        - FGL_LICENSE_KEY=<FGL License Key>
    Save the file, then run the following command to deploy your container:
    docker compose -f <file name> up
  4. Test the Application Server with http://localhost:8080/gas/demos.html.
  5. Run a health check with http://localhost:8080/gas/ws/r/heartbeat/HeartBeat/status.
  6. Use the docker exec command to run commands inside a Docker container. To check your container name run docker ps.
  7. The following command line gives you a bash shell inside your GAS container:
    docker exec -it gas_container_name bash
    The log is available through Docker's container log:
    docker logs gas_container_name
    

Persist Data From Your Genero Container

The Persisting container data webpage states "When a container starts, it uses the files and configuration provided by the image. Each container is able to create, modify, and delete files and does so without affecting any other containers. When the container is deleted, these file changes are also deleted.”

While this ephemeral nature of containers is great, it poses a challenge when you want to persist the data. For example, you might want to save certain configurations or any files on your Genero Container, so that when a container restarts the configurations are not lost, or even further you might want to start another container with the same configurations. So how can you persist these files?

The simple solution is to create Container Volumes. Let’s say you want to add/update configurations in the /usr/custom directory of your container, you will need to create a volume, we’ll call it custom-vol, and map the volume to the directory you want to persist, in this case /usr/custom. Here’s the example of the same .yaml file used in the previous example with the volume definition.
services:
gas:
    ports:
    - '8080:80'
    image: "567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime:5.00"
    restart: always
    environment:
    # FGL License
    - FGL_LICENSE_NUMBER=<FGL License Number>
    - FGL_LICENSE_KEY=<FGL License Key>
    volumes:
      - custom-vol:/usr/custom
volumes:
  custom-vol:
Note:

custom-vol: is supposed to be added this way.

When starting a container with the following command, the volume will be mounted or attached into the container at /usr/custom. If the volume custom-vol doesn't exist, Docker will automatically create it for you. When the container runs, all files it writes into the /usr/custom folder will be saved in this volume, outside of the container. If you delete the container and start a new container using the same volume, the files will still be there.

You can attach the same volume to multiple containers to share files between containers. This might be helpful in use case where you want to custom configure GAS, GIP or other services.

Deploy your Application to a Genero Container

Manual Deployment During Runtime

Let’s say you already have a Genero runtime container running and you want to run your application on it. Presuming that you’re application has no dependencies or specific libraries, you can easily build a gar, upload it to the container and connect to your app.
Note:

You can ask your support team to give you a gar with a sample application for you to test.

With the .gar, copy the name of your container by running docker ps and the local path to your .gar, then run:
docker cp archive_name container_id:/archive_name.gar
Get shell access to your container (follow the instructions in the Container shell access and viewing GAS logs step) and enable your gar:
export GASADMIN="/opt/fourjs/gas/bin/gasadmin gar -E res.appdata.path=/opt/fourjs/gas/appdata"
su - genero -c "$GASADMIN --deploy-archive /archive_name.gar"
su - genero -c "$GASADMIN --enable-archive archive_name"
Connect to your application from the browser. For example: http://localhost:8080/gas/ua/r/app_name, where app_name is one of the apps listed in the output of the --enable-archive command without the XCF extension. Taking the previous example, the output would be: Install application app_name.xcf into /opt/fourjs/gas/appdata/app

Automate Process

Instead of going through the copy/paste and deploy/enable steps manually, whenever you have a new version of your application, there are various ways to automate the process.

Ask your professional services team to get more information on this topic.

Connect to a Database Server from Your Genero Runtime Container

Your application might require a connection to a specific database server to start, log users in, retrieve data, and more. This process is simplified with the provided lineage of Genero Runtime images with db-clients installed. All you have to do is check whether your required database type is listed in the table of the image provided, copy the ECR Name to the image, and use that to start your container(s).

For example, you can use the following image to connect to a psql server from your Genero container
567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-psql
All you have to do is:
  • Pull the image -
    docker pull 567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-psql 
  • Start the container -
    docker run -it --privileged --rm --name gas -p 8080:80 -e FGL_LICENSE_NUMBER=<FGL LICENSE> -e FGL_LICENSE_KEY=<FGL_KEY> 567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-psql:latest
  • Now you can get shell access to your container and try connecting to a psql server:
    services:
      postgres:
        image: postgres:14-alpine
        ports:
          - 5432:5432
        environment:
          - POSTGRES_PASSWORD=S3cret
          - POSTGRES_USER=genero_user
          - POSTGRES_DB=genero_db
        hostname: psql-db
      gas:
        ports:
        - '8080:80'
        image: "567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime-psql"
          # You can specify any version of the provided gas image tags
        restart: always
        environment:
        # FGL License
        - FGL_LICENSE_NUMBER=<FGL License Number>
        - FGL_LICENSE_KEY=<FGL License Key>
    Note:

    To test this case, you can deploy a postgresql container and connect to it.

Once you get shell access to your gas container, you can connect to the psql container by running:
psql -h psql-db -d genero_db -u genero_user -W
Then enter the password.

Create your own Genero Container Image

Manually

If creating a Genero Container Image with your app installed on it is what you are looking for, then you can do this in various ways. Starting with a basic test step. After copying and pasting you gar file, deploying and enabling it on the container and testing that you get a connection, you can simply save the container’s state into a new image. This is similar to the VM snapshots.

To do that, check the Docker manual on the docker image save command: docker image save

After creating the image, you can start your new containers using that image, and your application will run on it.

You can also add libraries and files, install any other dependencies, or add configurations.

From DockerFile

You can create a new Docker Container image based on our Genero Container Image but with additions that your application requires by creating a new Docker file and adding all the requirements there. For example;

 FROM <our image> 
# Your features
COPY path/to/my_feature_script /path/to/target/location/my_feature_script 
...

Automatically via CI/CD

Taking the process of creating your own Genero Container Image 10 steps further by automating it via CI/CD pipelines.

An alternate way of creating a custom image with your app already built-in it is to compile it and install it in the same build process. To that end, we provide an image with GST Server installed on it. The GST Server image lets you compile your Genero project. The resulting files can then be transferred to a Genero runtime image in order to deploy your app.

We recommend using a gar file as the target, but you can compile your app using any mechanism you wish, in which case you’ll need to install what you need on the GST image (this can be done during the build phase).

Here is an example of usage of the GST image to build your custom Genero runtime image:
#*****************************************************************************#
## Intermediate build stage
FROM 567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/development-build-gar AS builder
ARG FGL_LICENSE_NUMBER
ARG FGL_LICENSE_KEY
  # You'll need to define FGL_LICENSE_NUMBER and FGL_LICENSE_KEY as environment variables in your repo
  # and pass them as build arguments.
ENV FGL_LICENSE_NUMBER=${FGL_LICENSE_NUMBER}
ENV FGL_LICENSE_KEY=${FGL_LICENSE_KEY}
ENV BUILD_CMD=gsmake
ENV SOURCE_4PW_FILE=/opt/genero/<your genero project folder>/<your app name>.4pw
  # Define the location of your 4pw file.
COPY ./<your genero project folder> /opt/genero/<your genero project folder>
  # Copy project folder to the builder container
RUN /entrypoint.sh
  # Build the project
  # /!\ Note that you can replace the call to '/entrypoint.sh' or 'gsmake' with the
  #     call to your preferred build command, you’ll also need to call /generate-fgllicense.sh
  #     beforehand in order to setup the Genero License, otherwise you won’t be able to compile
  #     your Genero Project.
#*****************************************************************************#
## Base Install Image
FROM 567640560273.dkr.ecr.eu-west-2.amazonaws.com/genero/enterprise/runtime
COPY --from=builder /opt/genero/<your genero project folder>/distbin/<your app name>.gar /<your app name>.gar
RUN su - genero -c "/opt/fourjs/gas/bin/gasadmin gar -E res.appdata.path=/opt/fourjs/gas/appdata --deploy-archive /<your app name>.gar" \
  && su - genero -c "/opt/fourjs/gas/bin/gasadmin gar -E res.appdata.path=/opt/fourjs/gas/appdata --enable-archive <your app name>"
  # NOTE: If you package your app in a different way, you'll have to install the binaries of your app accordingly.
#*****************************************************************************#
This dockerfile can then be used to build your image via a CI/CD pipeline. Here is a diagram that summarizes the build process in the case of Bitbucket’s Pipelines with ECR:

In order to properly manage your Genero app and your image, we recommend using 2 separate repositories: one for your Genero app code and one for your custom image build files. You can then declare the the Genero code’s repo as a sub module of the image’s repo. By doing that, you keep both projects (the image’s and the genero app’s) separate but the image’s repo has access to the genero code, which means you can build the app while building your image. A benefit of using sub-modules is that you can add as many genero apps as you need. Here is a link for more details about sub-modules: Git - Submodules

Here are the steps to follow in order to setup your image’s repo:

  1. Add your Genero code’s git repo as a submodule of your image’s repo:
     git submodule add <Your git link>
    Note:

    If you are using the pipelines build, your pipelines will need to be able to pull the Genero code’s git repo. To create a key for the pipelines, go to your image’s repository settings → under Pipelines, SSH Keys → Generate a key and configure your app’s repo to allow pulls using that generated key. If your Genero code’s repo is under Bitbucket, Repository Settings > Under Security > Access keys > Add key > Paste the public key you generated.

  2. Edit the Dockerfile to compile your app in a first stage and then build the final image with your app in the final stage. Example here: Bitbucket .
  3. Repeat for each app you want to add to your custom image.

Summary

Thank you for following this guide to help you get ahead in deploying your Genero application on Docker containers. Now that you know the basics, continue with our team of experts to deploy your Genero application in an advanced environment with various additions that improve your application lifecycle and user experience.

Advanced topics include:
  • Deploying your container(s) on Kubernetes.

  • Adding automated scaling.

  • Adding efficient load-balancing techniques and replication across different data centers across the world.

  • Enabling smart logging, monitoring, and alerting mechanisms.

And more. We are waiting to hear from you!