激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - docker entrypoint入口文件詳解

docker entrypoint入口文件詳解

2021-03-11 17:01breezey 服務器知識

這篇文章主要介紹了docker entrypoint入口文件詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在編寫Dockerfile的時候,包含一個entrypoint配置,該配置的作用是在容器啟動之前做一些初始化配置,或者一些自定義的配置等。通常是一個腳本,然后在腳本里配置相關預定義項。這篇文檔就詳細說一說entrypoint入口文件的編寫技巧。

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

docker-entrypoint.sh

set -e

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

set -o pipefail

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

shopt -s nullglob

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

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

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

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

如果判斷出來調用這個腳本后面所跟的參數第一個字符是-中橫線的話, 就認為后面的所有字符串都是 mysqld 的啟動參數

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

set -- mysqld "$@"

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

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

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

當執行完 set -- mysqld "$@" 這條命令后:

  • $1=mysqld
  • $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[@]} 會把這個數組當做可執行程序來執行

?
1
2
3
4
5
6
7
8
9
10
11
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 和轉發信號量的問題, 把這兩個工作直接交給了應用程序去完成

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/breezey/p/8812197.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91麻豆精品国产91久久久点播时间 | 久夜tv | 精品国产乱码久久久久久预案 | 久久99精品视频在线观看 | 欧美精品18| 欧美精品99 | 一级免费观看 | 在线日韩在线 | 九色激情网 | 精品91av| 国产999精品久久久久 | 午夜激情视频免费 | 欧美一级美国一级 | 欧美巨根 | 国产精品午夜一区 | 成人店女老板视频在线看 | 精品国产一区二区三区久久久 | 99这里精品| av在线高清观看 | 免费视频一区 | 日韩精品久久久久久久电影99爱 | 红杏亚洲影院一区二区三区 | 中文字幕在线观看二区 | chinese18 xxxx videos| 久久蜜桃香蕉精品一区二区三区 | 被摁着灌浓精囚禁高h1v1 | 免费看黄色一级片 | 日韩在线视频在线观看 | 91麻豆精品国产91久久久更新资源速度超快 | 特级黄色影院 | 国产99视频精品免视看9 | 欧美精品亚洲人成在线观看 | 国产91亚洲精品一区二区三区 | 欧美性猛交一区二区三区精品 | 12av毛片| 毛片国产 | 黄污在线观看 | 欧美五月婷婷 | 国产在线精品一区二区三区 | 国产精品99久久久久久久 | 一级黄片毛片免费看 |