The fat docker container

JRichardsz.java
2 min readDec 12, 2021

Some guy wanted to know how start several process in one docker container:

https://stackoverflow.com/questions/70308825/how-to-package-several-services-in-one-docker-image/70326121#70326121

image source: https://www.youtube.com/watch?v=rkvCFgKvl2I

My answer was: You can start several process in one docker container, but you should not do it

According to the Docker official docs:

It is generally recommended that you separate areas of concern by using one service per container

Also check this:

https://stackoverflow.com/a/68593731/3957754

docker-compose is enough

docker-compose exist just for that: Run several services with one click (minimal configurations) and commonly in the same server.

foreground process

In order to works a docker container needs a foreground process. To understand what is this, check the following links. As a extremely summary we can said you that a foreground process is something that when you launch it using the shell, the shell is taken and you can and you cannot enter more commands. You need to press ctrl + c to kill the process and get back your shell.

The “fat” container

Anyway, if you want to join several services or process in one container (previously an image) you can do it with supervisor.

Supervisor could works a our foreground process. Basically you need to register one or many linux processes and then, supervisor will start them.

how to install supervisor

sudo apt-get install supervisor

source: https://gist.github.com/hezhao/bb0bee800531b89d7be1#file-supervisor_cmd-sh

add single config: /etc/supervisor/conf.d/myapp.conf

[program:myapp] 
autostart = true
autorestart = true
command = python /home/pi/myapp.py environment=SECRET_ID="secret_id",SECRET_KEY="***"
stdout_logfile = /home/pi/stdout.log
stderr_logfile = /home/pi/stderr.log
startretries = 3
user = pi

source: https://gist.github.com/hezhao/bb0bee800531b89d7be1

start it

sudo supervisorctl start myapp 
sudo supervisorctl tail myapp
sudo supervisorctl status

multiple process with supervisor

In the previous sample, we are used supervisor to start a single python process. But if you need more process, you just need to add more [program] sections to the config file. Here a sample for php + dropbox:

[program:php7.2]
command=/usr/sbin/php-fpm7.2-zts
process_name=%(program_name)s
autostart=true
autorestart=true

[program:dropbox]
process_name=%(program_name)s
command=/app/.dropbox-dist/dropboxd
autostart=true
autorestart=true

Here more examples of supervisor and docker, just like your requirement several process in one container:

canvas lms : Basically starts 3 process: postgress, redis and a ruby app

https://github.com/harvard-dce/canvas-docker/blob/master/assets/supervisord.conf

ngnix + php + ssh

https://gist.github.com/pollend/b1f275eb7f00744800742ae7ce403048#file-supervisord-conf

nginx + php

https://gist.github.com/lovdianchel/e306b84437bfc12d7d33246d8b4cbfa6#file-supervisor-conf

mysql + redis + mongo + nginx + php

https://gist.github.com/nguyenthanhtung88/c599bfdad0b9088725ceb653304a91e3

Also you could configure a web dashboard:

https://medium.com/coinmonks/when-you-throw-a-web-crawler-to-a-devops-supervisord-562765606f7b

Another samples with docker + supervisor:

https://gist.github.com/chadrien/7db44f6093682bf8320c

https://gist.github.com/damianospark/6a429099a66bfb2139238b1ce3a05d79

Until the next,
JRichardsz

Originally published at https://jrichardsz.github.io on December 12, 2021.

--

--

JRichardsz.java

Programmer born in vulcan who searches for his internal properties file to perform an overclock in his brain and body. https://stackoverflow.com/users/3957754