Installing Supported Kernels (Containers)#

Gateway Provisioners includes tooling to generate kernel specifications that support the following kernels:

  • IPython kernel (Python)

  • Apache Toree (Scala)

  • IRKernel (R)

Kernel specifications reside within the host application image (or volume mount) and their generation is addressed in the applicable sections for Kubernetes and Docker/DockerSwarm. What follows are instructions for how to build the kernel-based image.

Tip

Gateway Provisioners provides a Makefile for building the various kernel images. The instructions that follow will reference make targets to accomplish these tasks.

Kernel-image Dockerfiles#

There are two forms of kernel images that can be created, one for regular or vanilla kernels, another for Spark-based kernels. Both use the same Dockerfile, but Spark-based images will specify a different base image from which the target image is derived.

Spark Base Image#

Spark-based images will be built upon the elyra/gp-spark-base image, whose Dockerfile is located in gateway_provisioners/docker/gp-spark-base. This image builds on jupyter/docker-stacks-foundation:2022-11-15 by installing Spark. However, that base can also be substituted via the build argument BASE_CONTAINER.

To build the spark base image use:

make gp-spark-base

This will create an image named, by default, elyra/gp-spark-base:dev. The organization (elyra) and tag (dev) can be controlled using variables DOCKER_ORG and TAG, respectively. For example, to create a gp-spark-base image with a custom organization and tag of the form my-custom-org/gp-spark-base:my-custom-tag, you can use:

make DOCKER_ORG=my-custom-org TAG=my-custom-tag gp-spark-base

Other arguments that can be specified are SPARK_VERSION (default is 3.3.1), HADOOP_VERSION (2), SCALA_VERSION (2.12), OPENJDK_VERSION (17), and SPARK_CHECKSUM (depends on SPARK_VERSION).

Tip

As with DOCKER_ORG and TAG, each of the above build arguments can be specified on the make command.

Kernel Images#

The Dockerfile used to create a kernel image representing any of the supported kernels is located in gateway_provisioners/docker/kernel-image.

This is a multi-stage build Dockerfile whose build options are driven by docker build arguments. There are three primary arguments that drive a kernel’s image build, BASE_CONTAINER, KERNEL_LANG, and PACKAGE_SOURCE.

BASE_CONTAINER#

Using a BASE_CONTAINER build argument (e.g., --build-arg BASE_CONTAINER=xxx) controls from which image the kernel image will be derived. By default, vanilla kernel images are derived from jupyter/docker-stacks-foundation:2022-11-15 while spark-based kernel images should specify a BASE_CONTAINER of either elyra/gp-spark-base:dev or another applicable image.

Gateway Provisioner’s Makefile supports targets for three spark-based images: gp-kernel-spark-py, gp-kernel-spark-r, and gp-kernel-scala, and two vanilla kernel images: gp-kernel-py and gp-kernel-r. As with the spark base image, the DOCKER_ORG and TAG can be similarly controlled, but by default, the following command will produce images names elyra/gp-kernel-spark-py:dev, elyra/gp-kernel-spark-r:dev, elyra/gp-kernel-scala:dev, elyra/gp-kernel-py:dev, and elyra/gp-kernel-r:dev:

make gp-kernel-spark-py gp-kernel-spark-r gp-kernel-scala gp-kernel-py gp-kernel-r

Attention

The Scala kernel (based on Apache Toree) is predicated on its use within a Spark environment, so a vanilla version of the Scala kernel is not provided.

Tip

The helper-target kernel-images can be used to create all five kernel images via make kernel-images.

KERNEL_LANG#

The second primary build argument to consider is the kernel language. Each of the previously mentioned Makefile targets automatically set --build-arg KERNEL_LANG=<lang> to the expected argument. If not specified, KERNEL_LANG defaults to python. KERNEL_LANG must be one of the following values: python, r, or scala.

It is this build argument that determines which kernel package to install, all of which is handled in the Dockerfile.

The resulting image will include an ENV entry of KERNEL_LANGUAGE with one of the respective values: Python, R, or Scala, as well as a LABEL entry of KERNEL_LANG with the respective lowercase form: python, r, or scala.

PACKAGE_SOURCE#

The third primary build argument is PACKAGE_SOURCE. This identifies from where the Gateway Provisioners installation should come. By default, PACKAGE_SOURCE=release, meaning that the Gateway Provisioners package will be installed from the latest release. If a build argument for PACKAGE_SOURCE specifies local, then the locally built wheel file for Gateway Provisioners will be installed. This option is ideal for development environments.

Because the Makefile is plumbed for PACKAGE_SOURCE, it can be specified directly in the make command. For example, the following will build a vanilla kernel for python using a locally built wheel file:

make PACKAGE_SOURCE=local gp-kernel-py

The resulting image will include a LABEL entry of PACKAGE_SOURCE with one of the respective values: release or local.

Bootstrapping the Kernel Image#

One of the more important tasks performed by kernel-image/Dockerfile is the installation of the bootstrap script. This script becomes the image’s command (CMD) and is placed into the image using the jupyter image-bootstrap install command line script.

CMD /usr/local/bin/bootstrap-kernel.sh

# Install bootstrap and applicable launchers (per languages)
RUN jupyter image-bootstrap install --languages ${KERNEL_LANG}

RUN chown jovyan:users /usr/local/bin/bootstrap-kernel.sh && \
	chmod 0755 /usr/local/bin/bootstrap-kernel.sh && \
	chown -R jovyan:users /usr/local/bin/kernel-launchers

Upon its installation, the CMD is set into the image and the necessary kernel-launcher scripts are placed into /usr/local/bin/kernel-launchers.