$2=-f
$3=xxx.conf
$@=mysqld -f xxx.conf
可以看到, 當執行 docker-entrypoint.sh腳本的時候后面加了 -x形式的參數之后, $@的值發生的改變, 在原有$@值的基礎之上, 在前面又預添加了 mysqld 命令
exec $@
幾乎在每個docker-entrypoint.sh腳本的最后一行, 執行的都是 exec $@命令
這個命令的意義在于你已經為你的鏡像預想到了應該有的調用情況, 當實際使用鏡像的人執行了你沒有預料到的可執行命令時, 將會走到腳本的這最后一行, 去執行用戶新的可執行命令
情況判斷
上面直接說了腳本的最后一行, 在之前的腳本中, 需要充分的去考慮你自己的腳本可能會被調用的情況. 還是拿 MySQL 官方的 dockerfile 來說, 他判斷以下情況:
開頭是 – , 認為是參數的情況
開頭是 mysqld, 且用戶 id 為0 (root 用戶) 的情況
開頭是 mysqld 的情況
判斷完自己應用的所有調用形態之后, 最后應該加上exec $@ 命令兜底
${mysql[@]}
Shell 中的數組, 直接執行 ${mysql[@]} 會把這個數組當做可執行程序來執行
mysql=( mysql --protocol=socket -uroot -hlocalhost --socket=${SOCKET} )
echo ${mysql[1]}
-- output: mysql
echo ${mysql[2]}
--output: --protocol=socket
echo ${mysql[3]}
--output: -uroot
echo ${mysql[4]}
--output: -hlocalhost
echo ${mysql[@]}
--output: mysql --protocol=socket -uroot -hlocalhost --socket=
exec gosu mysql $BASH_SOURCE $@
這里的 gosu 命令, 是 Linux 中 sudo 命令的輕量級”替代品”
gosu 是一個 golang 語言開發的工具, 用來取代 shell 中的 sudo 命令. su 和 sudo 命令有一些缺陷, 主要是會引起不確定的 TTY, 對信號量的轉發也存在問題. 如果僅僅為了使用特定的用戶運行程序, 使用 su 或 sudo 顯得太重了, 為此 gosu 應運而生.
gosu 直接借用了 libcontainer 在容器中啟動應用程序的原理, 使用 /etc/passwd 處理應用程序. gosu 首先找出指定的用戶或用戶組, 然后切換到該用戶或用戶組. 接下來, 使用 exec 啟動應用程序. 到此為止, gosu 完成了它的工作, 不會參與到應用程序后面的聲明周期中. 使用這種方式避免了 gosu 處理 TTY 和轉發信號量的問題, 把這兩個工作直接交給了應用程序去完成
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持三五互聯。
更多關于云服務器,域名注冊,虛擬主機的問題,請訪問三五互聯官網:m.shinetop.cn