Encab is a process manager that simplifies running multiple services in a container or from the command line.
It's essentially a replacement for complex, hand-written Docker Container Entrypoint scripts, especially when dockerizing complex legacy applications.
- Add it as your Dockerfile Entrypoint,
together with the encab configuration file
encab.yml
,
...
ADD encab.yml .
ENTRYPOINT ["encab"]
- Define what you want to run in your container in
encab.yml
,
programs:
cron:
command: cron -f
main:
command: httpd-foreground
and encab cares for the rest. Run it and you'll always know who's logging what...
INFO encab: encab 0.1.3
INFO encab: Using configuration file ./encab.yml, source: Default location.
ERROR main: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
ERROR main: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
ERROR main: [Wed Jan 18 09:47:12.417275 2023] [mpm_event:notice] [pid 12:tid 140142563044672] AH00489: Apache/2.4.54 (Unix) configured -- resuming normal operations
ERROR main: [Wed Jan 18 09:47:12.417830 2023] [core:notice] [pid 12:tid 140142563044672] AH00094: Command line: 'httpd -D FOREGROUND'
INFO cron: Hello Wed Jan 18 09:48:01 UTC 2023
It shares some similarities with supervisord which I've used before I wrote encab but supervisord is a process controll system not designed to run in a Container environment.
- run multiple programs in a container at a time with transparent logging
- run programs as different users
- handle environment variables in a flexible way
- simplify container debugging
- load, build, validate environment variables
- Python Version >= 3.7
- activated Python virtual environment such as miniconda or virtualenv
pip install -U encab
- Create sample encab file
encab.yml
encab:
dry_run: false
programs:
main:
sh:
- echo "Hello Encab!"
- Run locally:
encab
The result will be something like this:
INFO encab: encab 0.1.3
INFO encab: Using configuration file ./encab.yml, source: Default location.
INFO main: Hello Encab!
INFO main: Exited with rc: 0
- Docker from your Linux distribution or Docker Desktop.
- Create sample encab file
encab.yml
encab:
dry_run: false
programs:
main:
sh:
- echo "Hello Encab!"
-
Add Encab to your Docker file.
FROM python:3.10.8-slim-bullseye # -------------------------------------------- # Install Venv # ENV VIRTUAL_ENV=/opt/encabenv ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN python3 -m venv $VIRTUAL_ENV && \ pip install --upgrade pip # -------------------------------------------- # Install Encab # RUN pip install encab # ------------------------------------------- # add configuration file # ADD encab.yml . # ------------------------------------------- # set encab as entrypoint ENTRYPOINT ["encab"]
-
Build container
docker build -t encab_minimum .
-
Run container
docker run encab_minimum
Result:
INFO encab: encab 0.1.3 INFO encab: Using configuration file ./encab.yml, source: Default location. INFO main: Hello world! INFO main: Exited with rc: 0