최근에 많은 스크립트에서 이것을 보았지만 docker-entrypoint.sh
온라인에서 설명을 찾을 수 없습니다. 나의 첫 번째 생각은 이것이 신호와 관련이 있다는 것이었지만 그것은 꽤 터무니없는 추측이었습니다.
답변1
이 "$@"
비트는 단어 분리 및 파일 이름 생성("와일드카드")을 방지하기 위해 개별적으로 인용되는 위치 인수 목록(일반적으로 명령줄 인수)으로 확장됩니다.
exec
현재 프로세스를 해당 인수를 실행하여 생성된 프로세스로 바꿉니다 .
즉, exec "$@"
명령줄 인수에 의해 제공된 명령은 현재 프로세스가 대체된 상태로 실행됩니다( exec
명령이 실행될 수 있는 경우).
답변2
둘 다른대답은 무엇을 설명합니다 exec "$@"
.스택 오버플로에 대한 이 답변Docker에 중요한 이유를 설명했으며 짐작한 대로 신호와 관련이 있습니다.
이는 Docker에서 신호를 적절하게 프록시하는 데 매우 중요합니다. 예를 들어 Redis가 이 기능 없이 시작되면 켜짐을
exec
받지 못하며 완전히 종료될 기회도 없습니다. 어떤 경우에는 데이터 손실이나 좀비 프로세스가 발생할 수 있습니다.SIGTERM
docker stop
하위 프로세스를 시작하면(즉, 사용하지 않음
exec
) 상위 프로세스가 신호를 적절하게 처리하고 전달할 책임이 있습니다.supervisord
컨테이너에서 여러 프로세스를 실행할 때 이것이 가장 잘 사용되거나 유사한 이유 중 하나는 신호를 적절하게 전달한다는 것입니다.
답변3
"$@"
Bourne과 같은 셸에서 목록 컨텍스트는 모든 위치 인수를 별도의 인수로 확장합니다.
스크립트에서 처음에 위치 매개변수는 스크립트 자체에서 받은 매개변수입니다.
exec
쉘과 동일한 프로세스에서 명령을 실행하는 것입니다. 이는 스크립트가 실행할 마지막 명령입니다. 그 이후에는 프로세스가 셸 외부에서 다른 명령을 실행하기 때문입니다.
따라서 스크립트가
#! /bin/sh -
exec "$@"
그런 다음 셸 명령줄을 사용하여 스크립트를 호출합니다. 예를 들면 다음과 같습니다.
/path/to/your-script 'echo' "some test" 'x y'
이는 이전에 쉘이 실행되었던 것과 동일한 프로세스에서 실행될 인수 exec
로 및 echo
인수 로 호출 되며 (대부분의 구현 에서는 내장된 쉘이 아닌) 스크립트는 및 인수로 해석됩니다.some test
x y
echo
sh
/bin/echo
echo
some test
x y