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

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

Dockerfile中ENTRYPOINT 和 CMD的區(qū)別說明

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

在Docker的系統(tǒng)學習教程中我們了解到使用Dockerfile構建Docker鏡像為一個規(guī)范的方式,根據(jù)Dockerfile可以了解鏡像中安裝的組件的詳細內(nèi)容。

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

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

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

CMD 指令

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

docker run -it image /bin/bash

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

CMD ['/bin/bash']

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

docker run -it image

執(zhí)行效果一致。

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

[root@3a1bb0c9e35c /]#

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

docker run -it image /bin/ps

發(fā)現(xiàn)啟動容器后沒有shell ,只是打印出了當前容器中的進程狀態(tài),cmd 指令效果被覆蓋。

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

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

ENTRYPOINT 指令

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

以nginx 鏡像為例說明

首先構建一個nginx鏡像,并且指定容器運行時執(zhí)行的程序為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"

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

兩者聯(lián)合使用技巧

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

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

ENTRYPOINT ["/usr/sbin/nginx"]

CMD ["-h"]

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

如果使用docker run --name test -it test_nginx -g "daemon off" 啟動時,此時給定的運行參數(shù)會覆蓋掉CMD 指令對應的內(nèi)容,此時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如果任何語句的執(zhí)行結果不是true則應該退出. 這樣的好處是防止錯誤像滾雪球般變大導致一個致命的錯誤, 而這些錯誤本應該在之前就被處理掉. 如果要增加可讀性, 可以使用set -o errexit, 它的作用與set -e相同

set -o pipefail

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

shopt -s nullglob

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

if [ “${1:0:1}” = ‘-‘ ]; then…

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

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

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

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

set – mysqld “$@”

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

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

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

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

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

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

exec “$@”

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

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

情況判斷

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

開頭是 - , 認為是參數(shù)的情況

開頭是 mysqld, 且用戶 id 為0 (root 用戶) 的情況

開頭是 mysqld 的情況

判斷完自己應用的所有調(diào)用形態(tài)之后, 最后應該加上exec "$@" 命令兜底

${mysql[@]}

Shell 中的數(shù)組, 直接執(zhí)行 ${mysql[@]} 會把這個數(shù)組當做可執(zhí)行程序來執(zhí)行

➜ /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 語言開發(fā)的工具, 用來取代 shell 中的 sudo 命令. su 和 sudo 命令有一些缺陷, 主要是會引起不確定的 TTY, 對信號量的轉發(fā)也存在問題. 如果僅僅為了使用特定的用戶運行程序, 使用 su 或 sudo 顯得太重了, 為此 gosu 應運而生.

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

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

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

巨人網(wǎng)絡通訊聲明:本文標題《Dockerfile中ENTRYPOINT 和 CMD的區(qū)別說明》,本文關鍵詞  Dockerfile,中,ENTRYPOINT,和,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Dockerfile中ENTRYPOINT 和 CMD的區(qū)別說明》相關的同類信息!
  • 本頁收集關于Dockerfile中ENTRYPOINT 和 CMD的區(qū)別說明的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久热成人在线视频| 色呦呦一区二区三区| 欧美三级电影一区| 蜜桃久久精品一区二区| 国产高清在线精品| 粉嫩av一区二区三区| 三级成人在线视频| 国产精品高清亚洲| 精品欧美一区二区久久| 日本欧美在线观看| 国产成人精品一区二区三区四区 | 国产亚洲制服色| 欧美精品九九99久久| 欧美精品粉嫩高潮一区二区| 91麻豆国产福利精品| 成人性生交大片免费| 紧缚捆绑精品一区二区| 免费一级欧美片在线观看| 亚洲一区二区美女| 亚洲欧洲性图库| 欧美中文字幕久久| 色吧成人激情小说| 99re这里只有精品视频首页| 国产一区二区三区免费观看| 欧美综合一区二区| 一本大道av一区二区在线播放| 国产大片一区二区| 国产一区二区精品久久91| 激情综合一区二区三区| 国产欧美一区二区三区在线看蜜臀| 久久久久久久久免费| 欧美大尺度电影在线| 日韩欧美国产小视频| 成+人+亚洲+综合天堂| 亚洲精品成人少妇| 成人性色生活片| 国产精品综合在线视频| 青青草国产精品97视觉盛宴| 亚洲午夜一二三区视频| 亚洲国产综合人成综合网站| 日韩电影在线免费看| 日精品一区二区| 男人操女人的视频在线观看欧美 | 欧美视频在线一区二区三区 | 久久噜噜亚洲综合| 国产精品丝袜一区| 日韩毛片视频在线看| 天天综合网 天天综合色| 国产麻豆日韩欧美久久| 97se狠狠狠综合亚洲狠狠| 91成人在线精品| 欧美mv日韩mv| 亚洲人成亚洲人成在线观看图片| 成人动漫一区二区在线| 日本不卡一区二区三区高清视频| 奇米精品一区二区三区四区| 成人97人人超碰人人99| 欧美精品日韩一区| 亚洲视频在线观看一区| 美腿丝袜在线亚洲一区| 一本色道久久加勒比精品 | 国产精品乱码久久久久久| 一区二区三区在线看| 激情深爱一区二区| 在线视频一区二区免费| 欧美精品一区二区不卡| 中文字幕一区二| 久久99精品久久久| 欧美日韩第一区日日骚| 亚洲欧美综合色| 国产成人精品在线看| 精品三级在线看| 亚洲午夜激情av| 99国产精品久久久| 国产人成亚洲第一网站在线播放 | 亚洲精品在线观看视频| 一区二区欧美国产| 成人黄色综合网站| 精品少妇一区二区三区视频免付费 | 中文幕一区二区三区久久蜜桃| 亚洲.国产.中文慕字在线| 国产激情一区二区三区四区 | 欧美经典一区二区三区| 日韩av电影免费观看高清完整版 | 91论坛在线播放| 国产欧美日韩亚州综合| 另类小说一区二区三区| 欧美一区二区国产| 日本午夜一区二区| 欧美日韩精品一区二区天天拍小说| 成人欧美一区二区三区1314 | 欧美一区二区三区日韩| 一区二区久久久久| 色综合天天综合网天天狠天天| 久久精品这里都是精品| 国产91精品欧美| 欧美韩国日本综合| 成人精品鲁一区一区二区| 久久久青草青青国产亚洲免观| 国产一区二区三区不卡在线观看| 久久综合色播五月| 99精品视频在线观看免费| 精品动漫一区二区三区在线观看| 日本成人在线看| 日韩欧美国产一区二区三区| 日本不卡高清视频| 精品国产乱码久久久久久图片| 国产一区在线不卡| 国产精品私人影院| 91亚洲精品久久久蜜桃网站| 亚洲毛片av在线| 欧美日韩三级一区| 看电视剧不卡顿的网站| 国产亚洲短视频| 91视频免费播放| 午夜激情久久久| 国产丝袜在线精品| 色94色欧美sute亚洲线路一久 | www.日韩在线| 亚洲一卡二卡三卡四卡无卡久久| 欧美三级日本三级少妇99| 午夜精品123| 国产亚洲欧美一级| 91在线云播放| 日本三级韩国三级欧美三级| 精品国产污网站| 色综合天天天天做夜夜夜夜做| 日韩专区在线视频| 日本一区二区三区国色天香 | 一区二区三区中文字幕精品精品| 欧美日本一区二区在线观看| 国产一区欧美日韩| 亚洲国产成人在线| 欧美日韩成人高清| 国产激情视频一区二区三区欧美 | 综合网在线视频| 日韩欧美中文字幕制服| 成人sese在线| 蜜桃视频在线一区| 中文字幕av资源一区| 欧美一级欧美三级在线观看| av不卡免费电影| 国产一区二区在线看| 亚洲第一激情av| 国产精品你懂的在线欣赏| 日韩女优制服丝袜电影| 欧美伊人久久久久久久久影院| 国产成人高清在线| 理论片日本一区| 午夜久久福利影院| 亚洲乱码国产乱码精品精可以看| 久久免费视频一区| 6080午夜不卡| 精品污污网站免费看| 色一区在线观看| 成人手机电影网| 欧美日韩国产美| 美国毛片一区二区三区| 亚洲在线视频网站| 欧美国产一区二区在线观看| 日韩欧美黄色影院| 欧美美女喷水视频| 色天天综合色天天久久| 白白色 亚洲乱淫| 成人丝袜高跟foot| 国产成人av影院| 国产精品一级在线| 国产福利一区二区| 国产麻豆精品在线| 国产福利一区在线观看| 国内成人免费视频| 国模娜娜一区二区三区| 国产真实乱对白精彩久久| 麻豆精品蜜桃视频网站| 日本欧美加勒比视频| 青草国产精品久久久久久| 天天色综合天天| 日本伊人色综合网| 捆绑变态av一区二区三区| 另类欧美日韩国产在线| 国产一区在线精品| 成人小视频在线观看| 97久久精品人人做人人爽50路| 91在线看国产| 欧美人伦禁忌dvd放荡欲情| 91精品国产综合久久精品 | 国产午夜精品久久久久久免费视| 26uuu国产日韩综合| 久久久另类综合| 中文字幕av不卡| 亚洲日本va午夜在线影院| 一区二区三区中文字幕精品精品| 亚洲一区二区视频在线| 日本免费新一区视频| 国内精品嫩模私拍在线| 成年人国产精品| 欧美日韩精品综合在线| 久久综合久久久久88| 中文字幕视频一区| 亚洲成人免费在线观看|