프로세스가 도커 컨테이너 내에서 실행 중인지 확인하는 방법
[업데이트 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)
'code' 카테고리의 다른 글
투명한 단일 픽셀 이미지의 최소 파일 크기 (0) | 2020.11.26 |
---|---|
angularjs에서 선택 상자의 기본값을 어떻게 설정합니까? (0) | 2020.11.26 |
Swift에서 클래스 레벨 함수를 어떻게 선언합니까? (0) | 2020.11.26 |
툴바 이미지 중앙 (0) | 2020.11.26 |
Django : 로그인 페이지에서 로그인 한 사용자 리디렉션 (0) | 2020.11.26 |