婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Dockerfile中ENTRYPOINT 和 CMD的區別說明

Dockerfile中ENTRYPOINT 和 CMD的區別說明

熱門標簽:百度地圖底圖標注 智能電銷機器人真的有用么 中國地圖標注上各個省 電銷智能機器人試用 新鄉牧野400電話申請 高德地圖標注足跡怎么打標 撫州市城區地圖標注 企業辦理400電話收費標準 激光標記地圖標注

在Docker的系統學習教程中我們了解到使用Dockerfile構建Docker鏡像為一個規范的方式,根據Dockerfile可以了解鏡像中安裝的組件的詳細內容。

Dockerfile一般由四部分組成:第一,構建的基礎鏡像;第二,鏡像構建者的信息;第三,構建鏡像過程中鏡像層添加指令;第四,由該鏡像啟動容器時執行的程序。

本篇文章中涉及到的ENTRYPOINT 和CMD 屬于Dockerfile中的最后一部分,這兩個Dockerfile指令是用來告知Docker后臺程序啟動鏡像時需要執行的程序,兩者有細微的差別。

下面將從兩者的異同以及兩者聯合使用的高級技巧方面對兩個指令進行詳解。

CMD 指令

CMD 指令指定容器啟動時需要運行的程序。一般用最簡單的方式啟動一個容器時使用docker run 會傳遞參數給docker指令

docker run -it image /bin/bash

后面的/bin/bash 其實是傳遞參數,告知容器啟動時運行一個shell。這個過程可以用CMD 指令等效的替換

CMD ['/bin/bash']

因此在Dockerfile中存在這個CMD指令指定的命令時,啟動容器就可以不進行參數傳遞。

docker run -it image

執行效果一致。

[root@MiWiFi-R3L-srv test]# docker run --name test -it test_image

[root@3a1bb0c9e35c /]#

如果dockerfile中已經指定了容器啟動時運行的程序,同時在使用docker run 啟動容器時使用了命令行參數,那么dockerfile 中的cmd 指令將無效

docker run -it image /bin/ps

發現啟動容器后沒有shell ,只是打印出了當前容器中的進程狀態,cmd 指令效果被覆蓋。

 PID TTY     TIME CMD
  1 ?    00:00:00 ps
[root@MiWiFi-R3L-srv test]#

此時可以看到cmd 效果被覆蓋。在一個dockerfile中只有最后一個cmd 指令有效,因此一個dockerfile中只寫一個cmd 指令。

ENTRYPOINT 指令

ENTRYPOINT 指令效果與CMD 非常的類似,比較容易混淆兩者的功能。最大的區別在于使用的方式,ENTRYPOINT 指定的命令需要與docker run 啟動容器進行搭配,將docker run 指令后面跟的內容當做參數作為ENTRYPOINT指令指定的運行命令的參數,ENTRYPOINT 指定的linux命令一般是不會被覆蓋的。

以nginx 鏡像為例說明

首先構建一個nginx鏡像,并且指定容器運行時執行的程序為nginx。

FROM centos
MAINTAINER allocator
RUN yum install -y nginx
RUN echo 'hello world' > /usr/share/nginx/html/index.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx"]

然后啟動鏡像

docker run --name test -p 5000:80 -it test_nginx -g "daemon off"

后面兩個是作為參數傳遞給nginx啟動程序運行,此時nginx作為前臺程序運行,是一個web服務器,可以根據外部綁定的端口,通過瀏覽器正常看到hello world

兩者聯合使用技巧

已經明白了兩者的區別,可以利用兩者的特點構建一個含有默認啟動運行程序的鏡像,并且支持docker run 啟動時人為指定啟動程序運行的參數。

舉個例子。利用ENTRYPOINT 指定啟動時運行啟動nginx程序,并給定默認的運行參數為顯示幫助信息,dockerfile 構建如下:

ENTRYPOINT ["/usr/sbin/nginx"]

CMD ["-h"]

當使用docker run --name test -it test_nginx 不傳遞任何參數時,此時啟動容器會使用cmd 指令后的命令作為默認參數,打印nginx的幫助信息。此時cmd 后的內容并不是一個完整的指令,而是參數,如果其內容是一個完整的指令,那么它將覆蓋掉ENTRYPOINT 中的內容。

如果使用docker run --name test -it test_nginx -g "daemon off" 啟動時,此時給定的運行參數會覆蓋掉CMD 指令對應的內容,此時nginx將作為前臺進程運行,作為一個web服務器使用,通過browser可以看到hello world

補充知識:docker-entrypoint.sh 入口文件編寫技巧

在 docker 的官方 Registry 中(store.docker.com) 流行的第三方應用在自己的頁面中都提供了 dockerfile 的鏈接. 而很多 dockerfile 的 ENTRYPOINT 命令都是這么寫的 ["docker-entrypoint.sh"]

本篇文章就掃盲下 docker-entrypoint.sh 的特殊用法和設計邏輯

MySQL

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

➜ /tmp mysql=( mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" )
➜ /tmp echo ${mysql[1]}
mysql
➜ /tmp echo ${mysql[2]}
--protocol=socket
➜ /tmp echo ${mysql[3]}
-uroot
➜ /tmp echo ${mysql[4]}
-hlocalhost
➜ /tmp echo ${mysql[@]}
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 和轉發信號量的問題, 把這兩個工作直接交給了應用程序去完成

以上這篇Dockerfile中ENTRYPOINT 和 CMD的區別說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

標簽:西安 忻州 辛集 南通 海西 邯鄲 臨汾 延安

巨人網絡通訊聲明:本文標題《Dockerfile中ENTRYPOINT 和 CMD的區別說明》,本文關鍵詞  Dockerfile,中,ENTRYPOINT,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Dockerfile中ENTRYPOINT 和 CMD的區別說明》相關的同類信息!
  • 本頁收集關于Dockerfile中ENTRYPOINT 和 CMD的區別說明的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久88久久88久久久| 亚洲男人的天堂在线aⅴ视频| 91片在线免费观看| 国产不卡高清在线观看视频| 激情欧美一区二区| 国产ts人妖一区二区| 国产精品中文字幕日韩精品| 国产成人av福利| 国产精品资源在线| 成人精品gif动图一区| 播五月开心婷婷综合| 91天堂素人约啪| 在线看不卡av| 在线播放日韩导航| 日韩欧美的一区| 国产日韩精品一区二区三区在线| 国产网红主播福利一区二区| 国产精品久久久久精k8| 一区二区三区在线免费播放| 亚洲激情校园春色| 热久久久久久久| 风间由美中文字幕在线看视频国产欧美| 成人美女视频在线观看| 在线观看免费一区| 欧美成人女星排名| 中文字幕乱码日本亚洲一区二区| 亚洲青青青在线视频| 日韩黄色免费网站| 成人av电影在线| 91精品欧美一区二区三区综合在| 久久久777精品电影网影网| 亚洲欧美一区二区三区极速播放| 亚洲影院免费观看| 国产精品小仙女| 欧美高清视频不卡网| 国产欧美精品一区二区色综合| 一区二区三区日韩在线观看| 久久成人免费日本黄色| 91久久人澡人人添人人爽欧美| 欧美一激情一区二区三区| 最新中文字幕一区二区三区| 日韩av不卡一区二区| av欧美精品.com| 精品国产髙清在线看国产毛片| 国产精品福利影院| 久久99蜜桃精品| 欧美日韩成人在线| 中文字幕在线观看不卡| 久久99九九99精品| 欧美日韩国产首页| 亚洲精品自拍动漫在线| 激情综合一区二区三区| 欧美日韩国产片| 日韩理论电影院| 丁香一区二区三区| 欧美成人高清电影在线| 亚洲一级二级在线| 99国产精品视频免费观看| 久久久综合激的五月天| 奇米影视一区二区三区小说| 欧美午夜免费电影| 亚洲午夜精品网| 色欧美片视频在线观看| 国产精品免费aⅴ片在线观看| 欧美日韩国产在线观看| 国产精品乱人伦中文| 成人免费视频caoporn| 久久久久久久电影| 国产在线国偷精品免费看| 欧美色视频一区| 亚洲电影第三页| 欧美日韩综合在线| 五月天久久比比资源色| 欧美日韩大陆一区二区| 五月天一区二区| 欧美一区二区三区人| 日韩电影免费在线看| 欧美一区二区三区免费| 精油按摩中文字幕久久| 精品久久久久久综合日本欧美| 蜜桃视频一区二区三区| 精品国产青草久久久久福利| 狠狠久久亚洲欧美| 日本一区二区久久| 99这里只有久久精品视频| 自拍偷拍亚洲激情| 在线精品视频小说1| 午夜激情一区二区三区| 日韩三级精品电影久久久| 韩国三级在线一区| 日本一区二区三区久久久久久久久不 | 日韩久久一区二区| 在线国产电影不卡| 亚洲va天堂va国产va久| 3d动漫精品啪啪一区二区竹菊| 日本在线不卡视频| 中日韩av电影| 欧美日韩精品三区| 国产原创一区二区三区| 国产精品美女久久久久久久| 日本久久电影网| 久久99久国产精品黄毛片色诱| 国产亚洲精品aa午夜观看| 91亚洲精品久久久蜜桃| 亚洲电影一区二区三区| 久久这里只精品最新地址| 一本大道av一区二区在线播放 | 欧美一级日韩一级| 国产成人亚洲综合a∨婷婷| 亚洲欧洲日产国产综合网| 欧美精品在线视频| av高清久久久| 精品在线播放午夜| 亚洲综合男人的天堂| 精品99999| 欧美理论在线播放| 不卡av在线免费观看| 久久综合综合久久综合| 亚洲精品免费在线| 精品福利一区二区三区 | 蜜臀久久99精品久久久久久9| 国产日韩精品一区| 欧美裸体一区二区三区| 懂色av一区二区在线播放| 偷窥少妇高潮呻吟av久久免费| 国产女主播在线一区二区| 色婷婷综合久久久久中文 | 男人的天堂亚洲一区| 中文字幕制服丝袜一区二区三区| 日韩一区二区视频在线观看| 91老师国产黑色丝袜在线| 国产精品自拍一区| 国产综合久久久久久鬼色 | 99视频超级精品| 国产一区二区三区视频在线播放| 亚洲小说欧美激情另类| 亚洲三级小视频| 亚洲色图.com| 中文字幕一区二区5566日韩| 日韩精品一区二区三区四区| 欧美色涩在线第一页| 欧美亚洲自拍偷拍| 欧美三级三级三级| 在线免费精品视频| 欧美天堂亚洲电影院在线播放| 99视频热这里只有精品免费| 成人天堂资源www在线| 国产98色在线|日韩| 成人性生交大片免费| 粉嫩av一区二区三区在线播放| 国产成人精品网址| 成人免费黄色在线| 91色porny蝌蚪| 91成人看片片| 欧美另类videos死尸| 欧美久久一二区| 日韩欧美亚洲一区二区| 精品国产一二三区| 国产精品欧美一级免费| 国产精品久久毛片| 亚洲综合另类小说| 日韩专区一卡二卡| 国内成+人亚洲+欧美+综合在线| 久久激情五月婷婷| 不卡一区二区中文字幕| 91蜜桃婷婷狠狠久久综合9色| 在线观看欧美精品| 欧美电影精品一区二区| 亚洲国产高清不卡| 亚洲黄网站在线观看| 日本伊人精品一区二区三区观看方式| 老司机一区二区| 国产精品一线二线三线精华| 97精品视频在线观看自产线路二| 在线欧美一区二区| 亚洲精品在线三区| 国产精品人成在线观看免费 | 国产精品水嫩水嫩| 亚洲一区二区精品3399| 久久精品国产精品亚洲精品| jizz一区二区| 欧美精选一区二区| 中文字幕在线不卡视频| 日本不卡视频在线观看| 丰满少妇在线播放bd日韩电影| 欧美在线观看一区| 欧美精品一区二区久久婷婷| 国产精品国模大尺度视频| 日本vs亚洲vs韩国一区三区二区| 高清日韩电视剧大全免费| 911精品国产一区二区在线| 国产精品的网站| 精品一区二区av| 欧美日韩精品久久久| 亚洲国产激情av| 久久99久久99精品免视看婷婷| 91美女片黄在线观看| 精品久久久久99| 亚洲成av人片在www色猫咪| 成人高清视频在线|