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