[linux] 프로세스가 lxc / Docker 내에서 실행되는지 확인하는 방법은 무엇입니까?
프로세스 (스크립트)가 lxc 컨테이너 내에서 실행되는지 확인하는 방법이 있습니까 (~ Docker runtime)? 일부 프로그램이 가상 시스템 내에서 실행되는지 여부를 감지 할 수 있다는 것을 알고 있습니다.
답변
가장 신뢰할 수있는 방법은 확인하는 것 /proc/1/cgroup
입니다. 그것은 당신에게 init 프로세스의 컨트롤 그룹을 알려줄 것이고 당신이 컨테이너에 있지 않을 때는 /
모든 계층을위한 것입니다. 컨테이너 안에 있으면 앵커 포인트의 이름이 표시됩니다. LXC / Docker 컨테이너를 사용하면 비슷 /lxc/<containerid>
하거나 /docker/<containerid>
각각 비슷 합니다.
답변
Docker는 .dockerenv
컨테이너 내부의 디렉토리 트리 루트에 파일을 만듭니다 . 이 스크립트를 실행하여 확인할 수 있습니다
#!/bin/bash
if [ -f /.dockerenv ]; then
echo "I'm inside matrix ;(";
else
echo "I'm living in real world!";
fi
더 :
우분투는 실제로 bash 스크립트를 가지고 있으며 /bin/running-in-container
실제로 호출 된 컨테이너 유형을 반환 할 수 있습니다. 도움이 될 수 있습니다. 그래도 다른 주요 배포판에 대해서는 모른다.
답변
새로운 우분투 16.04 시스템, 새로운 systemd & lxc 2.0
sudo grep -qa container=lxc /proc/1/environ
답변
bash 스크립트에서 docker를 확인하는 간결한 방법은 다음과 같습니다.
#!/bin/bash
if grep docker /proc/1/cgroup -qa; then
echo I'm running on docker.
fi
답변
Docker에서 실행 중인지 확인하는 편리한 Python 함수 :
def in_docker():
""" Returns: True if running in a Docker container, else False """
with open('/proc/1/cgroup', 'rt') as ifh:
return 'docker' in ifh.read()
답변
프로세스의 PID를 추출하기 위해 proc의 sched (/ proc / $ PID / sched)를 사용합니다. 컨테이너 내부의 프로세스 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)
컨테이너에 있는지 여부를 구별하는 데 도움이됩니다.
답변
가장 쉬운 방법은 환경을 확인하는 것입니다. container=lxc
변수 가 있으면 컨테이너 내에 있습니다.
그렇지 않으면 루트 인 경우 수행 mknod
또는 mount
조작을 시도 할 수 있으며 , 실패하면 기능이 떨어지는 컨테이너에있을 가능성이 높습니다.