最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

docker entrypoint入口文件詳解

 更新時(shí)間:2018年11月15日 09:32:42   作者:breezey  
這篇文章主要介紹了docker entrypoint入口文件詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

在編寫Dockerfile的時(shí)候,包含一個(gè)entrypoint配置,該配置的作用是在容器啟動(dòng)之前做一些初始化配置,或者一些自定義的配置等。通常是一個(gè)腳本,然后在腳本里配置相關(guān)預(yù)定義項(xiàng)。這篇文檔就詳細(xì)說一說entrypoint入口文件的編寫技巧。

下面以mysql官方鏡像中的entrypoint文件docker-entrypoint.sh為例,文件地址為:

docker-entrypoint.sh

set -e

你寫的每個(gè)腳本都應(yīng)該在文件開頭加上set -e, 這句語句告訴bash如果任何語句的執(zhí)行結(jié)果不是true則應(yīng)該退出. 這樣的好處是防止錯(cuò)誤像滾雪球般變大導(dǎo)致一個(gè)致命的錯(cuò)誤, 而這些錯(cuò)誤本應(yīng)該在之前就被處理掉. 如果要增加可讀性, 可以使用set -o errexit, 它的作用與set -e相同

set -o pipefail

設(shè)計(jì)用途同上, 就是希望在執(zhí)行錯(cuò)誤之后立即退出, 不要再向下執(zhí)行了. 而 -o pipefail 的作用域是管道, 也就是說在 Linux 腳本中的管道, 如果前面的命令執(zhí)行出了問題, 應(yīng)該立即退出

shopt -s nullglob

在使用 Linux 中的通配符時(shí) * ?等 如果沒有匹配到任何文件, 不會(huì)報(bào) No such file or directory 而是將命令后面的參數(shù)去掉執(zhí)行

if [ "${1:0:1}" = '-' ]; then...

這是一個(gè)判斷語句, 在官方文件中, 上一行已經(jīng)給出了注釋: if command starts with an option, prepend mysqld

這個(gè)判斷語句是 ${1:0:1} 意思是判斷 $1(調(diào)用該腳本的第一個(gè)參數(shù)), 偏移量0(不偏移), 取一個(gè)字符(取字符串的長度)

如果判斷出來調(diào)用這個(gè)腳本后面所跟的參數(shù)第一個(gè)字符是-中橫線的話, 就認(rèn)為后面的所有字符串都是 mysqld 的啟動(dòng)參數(shù)

上面的這個(gè)操作類似于 Python 的字符串切片

set -- mysqld "$@"

在上面判斷完第一個(gè)參數(shù)是-開頭之后, 緊接著就執(zhí)行了 set -- mysqld "$@" 這個(gè)命令. 使用了 set -- 的用法. set --會(huì)將他后面所有以空格區(qū)分的字符串, 按順序分別存儲(chǔ)到$1, $2, $3 變量中, 其中新的$@為set --后面的全部內(nèi)容

舉例來說: bash docker-entrypoint.sh -f xxx.conf

在這種情況下, set -- mysqld "$@" 中的 $@ 的值為 -f xxx.conf

當(dāng)執(zhí)行完 set -- mysqld "$@" 這條命令后:

  • $1=mysqld
  • $2=-f
  • $3=xxx.conf
  • $@=mysqld -f xxx.conf

可以看到, 當(dāng)執(zhí)行 docker-entrypoint.sh腳本的時(shí)候后面加了 -x形式的參數(shù)之后, $@的值發(fā)生的改變, 在原有$@值的基礎(chǔ)之上, 在前面又預(yù)添加了 mysqld 命令

exec "$@"

幾乎在每個(gè)docker-entrypoint.sh腳本的最后一行, 執(zhí)行的都是 exec "$@"命令

這個(gè)命令的意義在于你已經(jīng)為你的鏡像預(yù)想到了應(yīng)該有的調(diào)用情況, 當(dāng)實(shí)際使用鏡像的人執(zhí)行了你沒有預(yù)料到的可執(zhí)行命令時(shí), 將會(huì)走到腳本的這最后一行, 去執(zhí)行用戶新的可執(zhí)行命令

情況判斷

上面直接說了腳本的最后一行, 在之前的腳本中, 需要充分的去考慮你自己的腳本可能會(huì)被調(diào)用的情況. 還是拿 MySQL 官方的 dockerfile 來說, 他判斷以下情況:

  • 開頭是 - , 認(rèn)為是參數(shù)的情況
  • 開頭是 mysqld, 且用戶 id 為0 (root 用戶) 的情況
  • 開頭是 mysqld 的情況
  • 判斷完自己應(yīng)用的所有調(diào)用形態(tài)之后, 最后應(yīng)該加上exec "$@" 命令兜底

${mysql[@]}

Shell 中的數(shù)組, 直接執(zhí)行 ${mysql[@]} 會(huì)把這個(gè)數(shù)組當(dāng)做可執(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 命令的輕量級(jí)”替代品”

gosu 是一個(gè) golang 語言開發(fā)的工具, 用來取代 shell 中的 sudo 命令. su 和 sudo 命令有一些缺陷, 主要是會(huì)引起不確定的 TTY, 對(duì)信號(hào)量的轉(zhuǎn)發(fā)也存在問題. 如果僅僅為了使用特定的用戶運(yùn)行程序, 使用 su 或 sudo 顯得太重了, 為此 gosu 應(yīng)運(yùn)而生.

gosu 直接借用了 libcontainer 在容器中啟動(dòng)應(yīng)用程序的原理, 使用 /etc/passwd 處理應(yīng)用程序. gosu 首先找出指定的用戶或用戶組, 然后切換到該用戶或用戶組. 接下來, 使用 exec 啟動(dòng)應(yīng)用程序. 到此為止, gosu 完成了它的工作, 不會(huì)參與到應(yīng)用程序后面的聲明周期中. 使用這種方式避免了 gosu 處理 TTY 和轉(zhuǎn)發(fā)信號(hào)量的問題, 把這兩個(gè)工作直接交給了應(yīng)用程序去完成

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何進(jìn)入、退出docker的container實(shí)現(xiàn)

    如何進(jìn)入、退出docker的container實(shí)現(xiàn)

    這篇文章主要介紹了如何進(jìn)入、退出docker的container實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 打包docker鏡像推送到遠(yuǎn)程服務(wù)器并部署到k8s的方法步驟

    打包docker鏡像推送到遠(yuǎn)程服務(wù)器并部署到k8s的方法步驟

    本文主要介紹了打包docker鏡像推送到遠(yuǎn)程服務(wù)器并部署到k8s的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 創(chuàng)建的docker容器時(shí)間顯示錯(cuò)誤/date錯(cuò)誤/時(shí)區(qū)錯(cuò)誤

    創(chuàng)建的docker容器時(shí)間顯示錯(cuò)誤/date錯(cuò)誤/時(shí)區(qū)錯(cuò)誤

    這篇文章主要介紹了創(chuàng)建的docker容器時(shí)間顯示錯(cuò)誤/date錯(cuò)誤/時(shí)區(qū)錯(cuò)誤的處理方法,一起看看吧
    2017-06-06
  • Docker容器服務(wù)編排利器詳解

    Docker容器服務(wù)編排利器詳解

    這篇文章主要介紹了Docker容器服務(wù)編排利器,主要包括使用使用Docker?Compose必要性及定義及一些Docker?Compose應(yīng)用參考資料,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • docker如何刪除懸空鏡像

    docker如何刪除懸空鏡像

    文章介紹了如何使用Docker命令刪除懸空鏡像,以提高服務(wù)器空間利用率,通過使用docker image命令結(jié)合filter和awk工具,可以過濾出沒有Tag的鏡像,并將其刪除,總結(jié)了兩種方法,一種是通過管道和awk命令,另一種是使用更簡單的docker rmi命令
    2025-02-02
  • Docker 徹底刪除私有庫鏡像的操作

    Docker 徹底刪除私有庫鏡像的操作

    這篇文章主要介紹了Docker 徹底刪除私有庫鏡像的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • docker啟動(dòng)時(shí)環(huán)境變量不生效的解決方法

    docker啟動(dòng)時(shí)環(huán)境變量不生效的解決方法

    因項(xiàng)目需要多處部署,所以打包成docker鏡像以便于部署,本文主要介紹了docker啟動(dòng)時(shí)環(huán)境變量不生效的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 解決docker 容器設(shè)置中文語言包出現(xiàn)的問題

    解決docker 容器設(shè)置中文語言包出現(xiàn)的問題

    這篇文章主要介紹了解決docker 容器設(shè)置中文語言包出現(xiàn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Docker安裝Redis配置遠(yuǎn)程連接及踩坑

    Docker安裝Redis配置遠(yuǎn)程連接及踩坑

    本文主要介紹了Docker安裝Redis配置遠(yuǎn)程連接及踩坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解Docker 容器基礎(chǔ)系統(tǒng)鏡像打包

    詳解Docker 容器基礎(chǔ)系統(tǒng)鏡像打包

    這篇文章主要介紹了詳解Docker 容器基礎(chǔ)系統(tǒng)鏡像打包,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12

最新評(píng)論

自贡市| 独山县| 宁夏| 登封市| 交口县| 彭阳县| 定陶县| 彩票| 呈贡县| 嘉禾县| 伊宁县| 石阡县| 中西区| 新河县| 寻乌县| 张家口市| 正宁县| 宁蒗| 凤城市| 睢宁县| 大冶市| 阳原县| 青岛市| 山西省| 镇康县| 手机| 天水市| 锡林浩特市| 高要市| 通海县| 祁门县| 久治县| 台北县| 平昌县| 全椒县| 略阳县| 改则县| 玛多县| 重庆市| 大丰市| 河东区|