init Tini는 당신이 생각할 수있는 가장 간단한 init 입니다.
모든 Tini는 한 아이를 낳는 것입니다 (Tini는 컨테이너에서 달려야합니다). 좀비를 수확하고 신호 전달을 수행하면서 모든 것을 종료 할 때까지 기다립니다.
Tini 사용에는 몇 가지 이점이 있습니다.
SIGTERM 신호 처리기를 명시 적으로 설치하지 않더라도 프로세스가 적절하게 종료됩니다.이것이 유용한 이유에 대한 자세한 내용은이 문제에 대한 자세한 내용을 검토하십시오. 토론 : Tini의 장점은 무엇입니까?.
참고 : Docker 1.13 이상을 사용하는 경우 Tini가 Docker 자체에 포함됩니다. 여기에는 모든 버전의 Docker CE가 포함됩니다. Tini를 활성화하려면 --init 플래그를 docker run 에 전달하십시오.
참고 : Tini에서 사용할 수있는 사전 제작 된 Docker 이미지가 있습니다. 현재 Ubuntu 또는 Centos 이미지를 기본으로 사용하고 있다면 그 중 하나를 드롭 인 교체로 사용할 수 있습니다.
참고 : Alpine Linux 및 Nixos 용 Tini 패키지가 있습니다. 설치 지침은 아래를 참조하십시오.
컨테이너에 Tini를 추가하고 실행 가능하게하십시오. 그런 다음 Tini를 불러 일으키고 프로그램과 그 주장을 Tini에 대한 주장으로 통과하십시오.
Docker에서는 EntryPoint를 사용하여 Tini를 수동으로 호출하는 것을 기억할 필요가 없습니다.
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
특정 조건에서 건너 -- 수는 있지만 항상 안전하도록 포함시킬 수도 있습니다. tini: invalid option -- 'c' 처럼 보이는 오류 메시지가 표시되면 -- 추가 해야합니다 .
Tini 자체에 대한 인수는 다음 예에서 -v 와 같이 전달되어야합니다. /tini -v -- /your/program .
참고 : 위의 이진은 64 비트 동적으로 연결된 이진입니다.
tini 및 tini-static Binaries는 키 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 을 사용하여 서명합니다.
gpg (패키지 관리자를 사용하여 설치할 수 있음)를 사용하여 서명을 확인할 수 있습니다.
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
tini 와 tini-static Binaries는 체크섬을 생성했습니다 ( SHA1 및 SHA256 ).
sha1sum 및 sha256sum (패키지 관리자를 사용하여 설치할 수 있음)을 사용하여 체크섬을 확인할 수 있습니다.
ENV TINI_VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64
&& wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64.sha256sum
&& echo "$(cat tini-amd64.sha256sum)" | sha256sum -c
Alpine Linux에서는 다음 명령을 사용하여 Tini를 설치할 수 있습니다.
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
Nix를 사용하면 다음 명령을 사용하여 Tini를 설치할 수 있습니다.
nix-env --install tini
Debian (Buster 또는 Newer)에서는 다음 명령을 사용하여 Tini를 설치할 수 있습니다.
apt-get install tini
/usr/bin/tini (및 /usr/bin/tini-static ), /tini 가 설치됩니다.
Arch Linux에는 AUR에 사용할 수있는 패키지가 있습니다. 공식 지침을 사용하여 설치하거나 AUR 도우미를 사용하십시오.
pacaur -S tini
팔과 32 비트 바이너리가 제공됩니다! 릴리스 탭에서 사용 가능한 이진의 전체 목록을 찾을 수 있습니다.
-v 인수는 여분의 장점 출력에 사용할 수 있습니다 (예 : -vvv 최대 3 번 전달할 수 있음).
기본적으로 Tini는 PID 1으로 실행하여 좀비를 거두기 위해 (PID 1처럼 실행하여 좀비가 Tini로 재배치됩니다).
어떤 이유로 든 Tini를 PID 1으로 실행할 수 없다면 Tini를 대신 스파이어로 등록해야합니다 (Linux> = 3.4에서만).
-s 인수를 Tini ( tini -s -- ... )에게 전달합니다.TINI_SUBREAPER (예 : export TINI_SUBREAPER= ).이것은 Tini가 PID 1으로 달리지 않더라도 좀비가 Tini에게 다시 부모를받을 수있게합니다.
참고 : Tini는 PID 1으로 실행되지 않고 거친 사람으로 등록되지 않았다는 것을 감지하면 경고를 발행합니다. 경고가 보이지 않으면 괜찮습니다.
Tini는 종료 할 때 자녀의 출구 코드를 재사용 할 것이지만, 때로는 이것이 바로 당신이 원하는 것이 아닐 수도 있습니다 (예 : 자녀가 Sigterm을받은 후 143으로 나가는 경우). 특히 이것은 Java 앱에서 문제가 될 수 있습니다.
이 경우 -e 플래그를 사용하여 임의의 종료 코드를 0으로 재구성 할 수 있습니다. 필요한 경우 플래그를 여러 번 전달할 수 있습니다.
예를 들어:
tini -e 143 -- ...
기본적으로 Tini는 즉각적인 아동 프로세스 만 죽입니다. 해당 프로세스에 신호를 보내는 것이 원하는 효과가없는 경우 불편할 수 있습니다. 예를 들어, 그렇다면
docker run krallin/ubuntu-tini sh -c 'sleep 10'
그리고 ctrl-c It는 아무 일도 일어나지 않습니다. Sigint는 'sh'프로세스로 보내지지만 '수면'이 끝날 때까지 기다리는 동안 그 쉘은 반응하지 않습니다.
-g 옵션을 사용하면 Tini가 아동 프로세스 그룹을 죽이므로 그룹의 모든 프로세스가 신호를 얻습니다. 이것은 CTRL-C 등을 수행 할 때 발생하는 일에 더 가까이 다가옵니다. 터미널에서 : 신호는 전경 프로세스 그룹으로 전송됩니다.
Tini는 부모 사망 신호를 설정할 수 있습니다. 부모 사망 신호를 설정하려면 부모가 종료 할 때 Tini가 수신 해야하는 신호의 이름으로 -p 플래그를 사용하십시오.
tini -p SIGTERM -- ...
참고 : 부모 사망 신호 및 사용 사례에 대한 자세한 내용은이 PR 토론을 참조하십시오.
Tini는 컨테이너의 기존 EntryPoint와 함께 사용할 수 있습니다!
EntryPoint가 /docker-entrypoint.sh 라고 가정하면 다음을 사용할 것입니다.
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini는 종속성이 거의 없지만 (LIBC에만 의존하는 경우에만) 컨테이너가 시작되지 않으면 정적으로 제작 된 버전을 대신 사용하는 것을 고려할 수 있습니다.
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini는 매우 작은 파일 (10kb 범위)이므로 컨테이너에 무게가 많이 추가되지 않습니다.
정적으로 연결된 버전은 더 크지 만 여전히 <1m입니다.
바이너리를 다운로드하지 않으려면 cmake . && make .
건축하기 전에 아마도 달리기를 원할 것입니다.
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
이렇게하면 오래된 Linux 커널 헤더 (<3.4)가있는 시스템을 구축하더라도 Tini는 아동 스파이퍼 지원으로 구축 될 것입니다. 이것은 일반적으로 Docker와 함께 Tini를 사용하려는 경우 일반적으로 원하는 것입니다 (호스트 커널이 Docker를 지원하는 경우 아동 서브 피버도 지원해야합니다).
프로세스를 스폰 한 후 Tini는 신호를 기다리고 신호를 아동 프로세스로 전달하고 컨테이너 내에서 생성 될 수있는 좀비 프로세스를 주기적으로 거두게됩니다.
"첫 번째"아동 프로세스가 종료되면 (위의 예제에서 /your/program ) Tini는 자식 프로세스의 종료 코드와 함께 종료됩니다 (따라서 컨테이너의 출구 코드를 확인하여 자녀가 성공적으로 종료했는지 확인할 수 있습니다).
당신이 기대하는 것처럼 작동하지 않는다면, Verbosity 수준을 높이는 것을 고려하십시오 (최대 3).
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
관리자 :
기고자 :
특별한 감사 :