Case Study Bloom Credit: Multi-Provider API Security with KrakenD

You are viewing a previous version of KrakenD Community Edition (v2.1), go to the latest version

Document updated on Dec 7, 2021

Generating a Docker artifact

If you use containers, the recommended approach is to write your own Dockerfile and deploy an immutable artifact (embedding the config).

In its simplified form would be:

FROM devopsfaith/krakend:v2.1
COPY krakend.json /etc/krakend/krakend.json
# Uncomment with Enterprise image:
# COPY LICENSE /etc/krakend/LICENSE
Volume or copy?
Even though you can use the official container directly and attach the configuration mounting an external volume (or ConfigMap in Kubernetes), a custom image with your configuration copied inside has benefits. It guarantees that you can do safe rollbacks and have effective testing and debugging. If you break something at any point, you only need to deploy the previous container, while if you use a volume, you are exposed to downtime or impossible scaling until you fix it.

A more real-life example illustrates below a combination of the check command with a multi-stage build to compile a flexible configuration in a Dockerfile:

FROM devopsfaith/krakend:v2.1 as builder
ARG ENV=prod

COPY krakend.tmpl .
COPY config .

## Save temporary file to /tmp to avoid permission errors
RUN FC_ENABLE=1 \
    FC_OUT=/tmp/krakend.json \
    FC_PARTIALS="/etc/krakend/partials" \
    FC_SETTINGS="/etc/krakend/settings/$ENV" \
    FC_TEMPLATES="/etc/krakend/templates" \
    krakend check -d -t -c krakend.tmpl

# The linting needs the final krakend.json file
RUN krakend check -c /tmp/krakend.json --lint

FROM devopsfaith/krakend:v2.1
COPY --from=builder --chown=krakend:nogroup /tmp/krakend.json .
# Uncomment with Enterprise image:
# COPY LICENSE /etc/krakend/LICENSE

The Dockerfile above has two stages:

  1. The copy of all templates and intermediate files to end with a check command that compiles the template krakend.tmpl and any included sub-template inside. The command outputs (thanks to FC_OUT) the result into a /tmp/krakend.json file.
  2. The krakend.json file from the previous build is the only addition to the final Docker image.

The example Dockerfile above assumes that you have a file structure like this:

.
├── config
│   ├── partials
│   ├── settings
│   │   ├── prod
│   │   │   └── env.json
│   │   └── test
│   │       └── env.json
│   └── templates
│       └── some.tmpl
├── Dockerfile
└── krakend.tmpl

If you want to try this code, you can either download a working Flexible Config example, or generate an empty skeleton like this:

mkdir -p config/{partials,settings,templates}
mkdir -p config/settings/{prod,test}
touch config/settings/{prod,test}/env.json
touch Dockerfile
touch krakend.tmpl

Now the only missing step to generate the image, is to build it, making sure that the environment argument matches our folder inside the settings folder:

Docker build 

$docker build --build-arg ENV=prod -t mykrakend .

The resulting image, including your configuration, weighs around 80MB.

Scarf

Unresolved issues?

The documentation is only a piece of the help you can get! Whether you are looking for Open Source or Enterprise support, see more support channels that can help you.

See all support channels