Linux
exec '$@'
有什麼作用?
我最近在很多
docker-entrypoint.sh
腳本中都看到了這一點,在網上找不到解釋。我的第一個想法是它與信號有關,但這是一個非常瘋狂的猜測。
該
"$@"
位將擴展到位置參數列表(通常是命令行參數),單獨引用以避免分詞和文件名生成(“globbing”)。將
exec
用執行其參數產生的程序替換目前程序。簡而言之,
exec "$@"
將以這樣一種方式執行命令行參數給出的命令,即目前程序被它替換(如果exec
能夠執行該命令)。
另外兩個答案解釋了什麼
exec "$@"
。Stack Overflow 上的這個答案解釋了為什麼它對 Docker 很重要,並且正如您所猜測的,它確實與信號有關:這在 Docker 中對於正確代理信號很重要。例如,如果 Redis 在沒有 的情況下啟動
exec
,它將不會收到SIGTERM
啟動,docker stop
也不會有機會乾淨地關閉。在某些情況下,這可能會導致數據失去或殭屍程序。如果您確實啟動了子程序(即不使用
exec
),則父程序將負責處理和轉發適當的信號。supervisord
這是在容器中執行多個程序時最好使用或類似的原因之一,因為它會適當地轉發信號。