code

프로세스가 도커 컨테이너 내에서 실행 중인지 확인하는 방법

codestyles 2020. 11. 26. 08:17
반응형

프로세스가 도커 컨테이너 내에서 실행 중인지 확인하는 방법


[업데이트 1] 일부 기능에서 TCP 커널 매개 변수를 변경하는 셸이 있지만 이제이 셸을 Docker 컨테이너에서 실행해야합니다. 즉, 셸이 컨테이너 내에서 실행되고 있음을 알고 커널 구성을 중지해야합니다.

이제 그것을 달성하는 방법을 잘 모르겠습니다 /proc/self/cgroup. 컨테이너 내부의 내용은 다음과 같습니다.

9:hugetlb:/
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/

위의 플래그를 사용하여이 프로세스가 컨테이너 내에서 실행 중인지 확인할 수 있습니까?

[Updated2] : 또한 프로세스가 lxc / Docker 내부에서 실행되는지 확인 했지만이 경우 작동하지 않는 것 같습니다. /proc/1/cgroup내 컨테이너 의 내용 은 다음과 같습니다.

8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/

/ lxc / containerid 없음


Docker 컨테이너 내부에 있는지 여부를 Docker 컨테이너 내부에 확인하려면 /proc/1/cgroup. 마찬가지로 이 게시물 제안 당신은 다음에 할 수 있습니다 :

여기에서 볼 수 있듯이 도커 컨테이너 외부에서는 모든 항목이 /proc/1/cgroup/납니다.

vagrant@ubuntu-13:~$ cat /proc/1/cgroup
11:name=systemd:/
10:hugetlb:/
9:perf_event:/
8:blkio:/
7:freezer:/
6:devices:/
5:memory:/
4:cpuacct:/
3:cpu:/
2:cpuset:/

Docker 컨테이너 내부에서 일부 제어 그룹은 Docker (또는 LXC)에 속합니다.

vagrant@ubuntu-13:~$ docker run busybox cat /proc/1/cgroup
11:name=systemd:/
10:hugetlb:/
9:perf_event:/
8:blkio:/
7:freezer:/
6:devices:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c2
5:memory:/
4:cpuacct:/
3:cpu:/docker/3601745b3bd54d9780436faa5f0e4f72bb46231663bb99a6bb892764917832c2
2:cpuset:/

Docker 는 컨테이너의 디렉토리 트리 상단에 .dockerenv( v1.11에서 제거됨 ) 파일을 생성하므로 파일이 존재하는지 확인할 수 있습니다. .dockerinit

이와 같은 것이 작동합니다.

#!/bin/bash
if [ -f /.dockerenv ]; then
    echo "I'm inside matrix ;(";
else
    echo "I'm living in real world!";
fi

proc의 sched (/ proc / $ PID / sched)를 사용하여 프로세스의 PID를 추출합니다. 컨테이너 내부의 프로세스 PID는 호스트 (비 컨테이너 시스템)의 PID와 다릅니다.

예를 들어 컨테이너의 / proc / 1 / sched 출력은 다음을 반환합니다.

root@33044d65037c:~# cat /proc/1/sched | head -n 1
bash (5276, #threads: 1)

비 컨테이너 호스트에서 :

$ cat /proc/1/sched  | head -n 1
init (1, #threads: 1)

이것은 당신이 용기에 있는지 아닌지를 구별하는 데 도움이됩니다. 예를 들어 다음과 같이 할 수 있습니다.

if [[ ! $(cat /proc/1/sched | head -n 1 | grep init) ]]; then {
    echo in docker
} else {
    echo not in docker
} fi

코드로서의 Thomas의 솔루션 :

running_in_docker() {
  (awk -F/ '$2 == "docker"' /proc/self/cgroup | read non_empty_input)
}

노트

read더미 변수를위한이 단순한 관용구이다 합니까이 어떠한 출력을 생성? . 그것은 아마도 자세한 닝을위한 컴팩트 한 방법이다 grep또는 awk테스트 패턴의.

읽기에 대한 추가 참고 사항


컨테이너에서 실행되는 프로세스를 제외해야했지만 docker cgroup 만 확인하는 대신 /proc/<pid>/ns/pid에서 init 시스템 과 비교 하기 로 결정 했습니다 /proc/1/ns/pid. 예:

pid=$(ps ax | grep "[r]edis-server \*:6379" | awk '{print $1}')
if [ $(readlink "/proc/$pid/ns/pid") == $(readlink /proc/1/ns/pid) ]; then
   echo "pid $pid is the same namespace as init system"
else
   echo "pid $pid is in a different namespace as init system"
fi

또는 우리의 경우 프로세스가 컨테이너에 없으면 오류를 생성하는 하나의 라이너를 원했습니다.

bash -c "test -h /proc/4129/ns/pid && test $(readlink /proc/4129/ns/pid) != $(readlink /proc/1/ns/pid)"

which we can execute from another process and if the exit code is zero then the specified PID is running in a different namespace.


What works for me is to check for the inode number of the '/.' Inside the docker, its a very high number. Outside the docker, its a very low number like '2'. I reckon this approach would also depend on the FileSystem being used.

Example

Inside the docker:

# ls -ali / | sed '2!d' |awk {'print $1'}
1565265

Outside the docker

$ ls -ali / | sed '2!d' |awk {'print $1'}
2

In a script:

#!/bin/bash
INODE_NUM=`ls -ali / | sed '2!d' |awk {'print $1'}`
if [ $INODE_NUM == '2' ];
then
        echo "Outside the docker"
else
        echo "Inside the docker"
fi

I've created a small python script. Hope someone finds it useful. :-)

#!/usr/bin/env python3
#@author Jorge III Altamirano Astorga 2018
import re
import math

total = None
meminfo = open('/proc/meminfo', 'r')
for line in meminfo:
    line = line.strip()
    if "MemTotal:" in line:
        line = re.sub("[^0-9]*", "", line)
        total = int(line)
meminfo.close()
print("Total memory: %d kB"%total)

procinfo = open('/proc/self/cgroup', 'r')
for line in procinfo: 
    line = line.strip()
    if re.match('.{1,5}:name=systemd:', line):
        dockerd = "/sys/fs/cgroup/memory" + \
            re.sub("^.{1,5}:name=systemd:", "", line) + \
            "/memory.stat"
        #print(dockerd)
        memstat = open(dockerd, 'r')
        for memline in memstat:
            memline = memline.strip()
            if re.match("hierarchical_memory_limit", memline):
                memline = re.sub("[^0-9]*", \
                    "", memline)  
                total = math.floor(int(memline) / 2**10)
        memstat.close()
procinfo.close()
print("Total available memory to the container: %d kB"%total)

참고URL : https://stackoverflow.com/questions/23513045/how-to-check-if-a-process-is-running-inside-docker-container

반응형