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 krakend/krakend-ee:2.2
COPY krakend.json /etc/krakend/krakend.json
# Uncomment with Enterprise image:
# COPY LICENSE /etc/krakend/LICENSE
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 krakend/krakend-ee:2.2 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 krakend/krakend-ee:2.2
COPY --from=builder --chown=krakend:nogroup /tmp/krakend.json .
# Uncomment with Enterprise image:
# COPY LICENSE /etc/krakend/LICENSE
The Dockerfile above has two stages:
- The copy of all templates and intermediate files to end with a
checkcommand that compiles the templatekrakend.tmpland any included sub-template inside. The command outputs (thanks toFC_OUT) the result into a/tmp/krakend.jsonfile. - The
krakend.jsonfile 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.
