How to check if a process is running inside docker container?
Docker creates .dockerenv
and (removed in v1.11) files at the top of the container's directory tree so you might want to check if those exist..dockerinit
Something like this should work.
#!/bin/bashif [ -f /.dockerenv ]; then echo "I'm inside matrix ;(";else echo "I'm living in real world!";fi
To check inside a Docker container if you are inside a Docker container or not can be done via /proc/1/cgroup
. As this post suggests you can to the following:
Outside a docker container all entries in /proc/1/cgroup
end on /
as you can see here:
vagrant@ubuntu-13:~$ cat /proc/1/cgroup11:name=systemd:/10:hugetlb:/9:perf_event:/8:blkio:/7:freezer:/6:devices:/5:memory:/4:cpuacct:/3:cpu:/2:cpuset:/
Inside a Docker container some of the control groups will belong to Docker (or LXC):
vagrant@ubuntu-13:~$ docker run busybox cat /proc/1/cgroup11:name=systemd:/10:hugetlb:/9:perf_event:/8:blkio:/7:freezer:/6:devices:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c25:memory:/4:cpuacct:/3:cpu:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c22:cpuset:/
We use the proc's sched (/proc/$PID/sched) to extract the PID of the process. The process's PID inside the container will differ then it's PID on the host (a non-container system).
For example, the output of /proc/1/sched on a containerwill return:
root@33044d65037c:~# cat /proc/1/sched | head -n 1bash (5276, #threads: 1)
While on a non-container host:
$ cat /proc/1/sched | head -n 1init (1, #threads: 1)
This helps to differentiate if you are in a container or not. eg you can do:
if [[ ! $(cat /proc/1/sched | head -n 1 | grep init) ]]; then { echo in docker} else { echo not in docker} fi