[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조작을 시도 할 수 있으며 , 실패하면 기능이 떨어지는 컨테이너에있을 가능성이 높습니다.