programing

-e 집합과 "$@" 실행은 도커 진입점 스크립트에서 무엇을 합니까?

sourcejob 2023. 9. 11. 21:38
반응형

-e 집합과 "$@" 실행은 도커 진입점 스크립트에서 무엇을 합니까?

저는 그 많은 진입 지점을 알아 차렸습니다.도커용 sh 스크립트는 다음과 같은 작업을 수행합니다.

#!/bin/bash
set -e

... code ...

exec "$@"

뭐가.set -e그리고.exec "$@"왜요?

기본적으로 전달되는 모든 명령줄 인수를 사용합니다.entrypoint.sh명령으로 실행하는 겁니다이 의도는 기본적으로 "이 .sh 스크립트에서 모든 것을 수행한 다음 동일한 셸에서 사용자가 명령줄에 전달하는 명령을 실행"하는 것입니다.

참조:

set -e실행 중인 명령이 0이 아닌 종료 코드로 종료될 경우 즉시 종료되도록 셸 옵션을 설정합니다.스크립트는 실패한 명령의 종료 코드와 함께 반환됩니다.배시맨 페이지에서:

집합 -e:

파이프라인(단일 단순 명령으로 구성될 수 있음), 목록 또는 복합 명령(위의 SHELL GARMARM 참조)이 0이 아닌 상태로 종료되면 즉시 종료합니다.실패한 명령이 잠시 후 또는 키워드가 있을 때까지 명령 목록의 일부, if 또는 elif reserved words 뒤에 있는 테스트의 일부, final & 또는 || 뒤에 오는 명령을 제외하고 && 또는 || 목록에서 실행되는 명령의 일부, 파이프라인의 명령을 제외하고 마지막에 실행되는 명령의 일부일 경우 셸은 종료되지 않습니다.명령의 반환 값이 !와 반전되는 경우.-e가 무시되는 동안 명령이 실패하여 하위 셸이 아닌 복합 명령이 0이 아닌 상태를 반환하면 셸이 종료되지 않습니다.ERR에 대한 트랩(설정된 경우)은 셸이 종료되기 전에 실행됩니다.이 옵션은 셸 환경과 각 하위 셸 환경에 별도로 적용되며(위의 COMMAND EXECUTION ENMENCE 참조), 하위 셸의 모든 명령을 실행하기 전에 하위 셸이 종료될 수 있습니다.

compound 명령 또는 shell 기능이 -e가 무시되고 있는 상황에서 실행되는 경우 -e가 설정되어 있고 명령이 실패 상태를 반환하더라도 compound 명령 또는 function body 내에서 실행되는 명령은 -e 설정에 영향을 받지 않습니다.compound 명령 또는 shell 함수가 -e를 무시하는 컨텍스트에서 실행하는 동안 -e를 설정하면 compound 명령 또는 함수 호출을 포함하는 명령이 완료될 때까지 해당 설정이 적용되지 않습니다.


exec "$@"일반적으로 진입점을 통과시킨 다음 도커 명령을 실행하는 데 사용됩니다. 중인 재행을음로다인로합니다 명령으로 합니다."$@"가리키고 있습니다.기본적으로 해당 변수는 명령줄 인수를 가리킵니다.

가리키는 가 있고 를 진입점으로 .sh 을 가리키는 진입점이 있는 이미지가 있고 컨테이너를 다음과 같이 실행하는 경우docker run my_image server start은 달리기로 입니다, 은 로 될 입니다 입니다 될 로 은 .entrypoint.sh server start컨테이너 안에실행 라인에서entrypoint.sh인 pid 1로 됩니다.server start.

이는 신호 처리에 매우 중요합니다.을 사용하지 exec , , , , , , , , , , , , , , , , , , .server start위의 예에서는 다른 pid로 실행되고 종료된 후 셸 스크립트로 돌아갑니다.1인 됩니다.pid 1인 경우 SIGTERM은 무시됩니다.은 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ,docker stop당신의 컨테이너로 보내는 것들은 절대로 수신되지 않을 것입니다.server과정. 10초(기본값 10 (기본값),docker stop앱을 강제로 종료할 수 있는 SIGKILL을 전송하지만, 데이터 손실 가능성이 있거나 폐쇄된 네트워크 연결로 인해 앱 개발자들이 신호를 수신할 경우 코드화할 수 있습니다.이는 또한 컨테이너가 정지하는 데 항상 10초가 걸린다는 것을 의미합니다.

셸 명령을 사용하면 다음과 같은 것을 알 수 있습니다.shift그리고.set --, 의 을 할 할 수 ."$@"들어 에서 . 를 이 의 이 를 제거합니다./bin/sh -c "..."명령어를 를 사용할 수 CMD:

# convert `/bin/sh -c "server start"` to `server start`
if [ $# -gt 1 ] && [ x"$1" = x"/bin/sh" ] && [ x"$2" = x"-c" ]; then
  shift 2
  eval "set -- $1"
fi

....

exec "$@"

set -e실패하면 이 아닌 값 -트료닌면값 (0이이)값 )

exec "$@"- 입력 변수를 리디렉션합니다. 자세한 내용은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/39082768/what-does-set-e-and-exec-do-for-docker-entrypoint-scripts

반응형