How to make a Docker application write to stdout
Some applications do not redirect their logs to the stdout but rather to some files. Hence, when putting in a Docker image, the output of the docker logs doesn’t display the logs of the application.
In other cases, a docker image contains background processes and they are not attached to docker
log collector, i.e. performing
docker log <container_name> does not display their content.
Having their logs displayed directly from the docker logs can be useful for various reasons:
- a simple
docker logswill read the logs, instead of reading the log file in the container
- some tools leverages the docker logs to collect and aggregate into a logging system (e.g. ELK)
If the application is running as PID 1, we can create a symbolic link to
/dev/stdout from the log
files that the application is writing to. The result will then not write into a file but go to
Example of a Dockerfile that add this “hack”:
If the application is not running as PID 1, instead of
/dev/stdout, we can use
Note: we could directly use
/proc/1/fd/1 for both cases, but I prefer the
/dev/stdout syntax as
it’s more understandable.