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

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

 更新時(shí)間:2020年11月21日 09:05:08   作者:Allocator  
這篇文章主要介紹了Dockerfile中ENTRYPOINT 和 CMD的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

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

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

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

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

CMD 指令

CMD 指令指定容器啟動(dòng)時(shí)需要運(yùn)行的程序。一般用最簡(jiǎn)單的方式啟動(dòng)一個(gè)容器時(shí)使用docker run 會(huì)傳遞參數(shù)給docker指令

docker run -it image /bin/bash

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

CMD ['/bin/bash']

因此在Dockerfile中存在這個(gè)CMD指令指定的命令時(shí),啟動(dòng)容器就可以不進(jìn)行參數(shù)傳遞。

docker run -it image

執(zhí)行效果一致。

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

[root@3a1bb0c9e35c /]#

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

docker run -it image /bin/ps

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

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

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

ENTRYPOINT 指令

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

以nginx 鏡像為例說明

首先構(gòu)建一個(gè)nginx鏡像,并且指定容器運(yùn)行時(shí)執(zhí)行的程序?yàn)閚ginx。

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"]

然后啟動(dòng)鏡像

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

后面兩個(gè)是作為參數(shù)傳遞給nginx啟動(dòng)程序運(yùn)行,此時(shí)nginx作為前臺(tái)程序運(yùn)行,是一個(gè)web服務(wù)器,可以根據(jù)外部綁定的端口,通過瀏覽器正??吹絟ello world

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

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

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

ENTRYPOINT ["/usr/sbin/nginx"]

CMD ["-h"]

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

如果使用docker run --name test -it test_nginx -g "daemon off" 啟動(dòng)時(shí),此時(shí)給定的運(yùn)行參數(shù)會(huì)覆蓋掉CMD 指令對(duì)應(yīng)的內(nèi)容,此時(shí)nginx將作為前臺(tái)進(jìn)程運(yùn)行,作為一個(gè)web服務(wù)器使用,通過browser可以看到hello world

補(bǔ)充知識(shí):docker-entrypoint.sh 入口文件編寫技巧

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

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

MySQL

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è)字符(取字符串的長(zhǎng)度)

如果判斷出來調(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 — 后面的全部?jī)?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í)行

➜ /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 命令的輕量級(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)用程序去完成

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

相關(guān)文章

  • Docker daemon 無法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法

    Docker daemon 無法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法

    這篇文章主要介紹了Docker daemon 無法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Docker如何使用link建立容器之間的連接

    Docker如何使用link建立容器之間的連接

    本篇文章主要介紹了Docker如何使用link建立容器之間的連接,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • docker搭建Jenkins以及基本使用圖文教程

    docker搭建Jenkins以及基本使用圖文教程

    Jenkins是一個(gè)廣泛使用的開源持續(xù)集成工具,它能夠自動(dòng)化構(gòu)建、測(cè)試和部署軟件項(xiàng)目,這篇文章主要給大家介紹了關(guān)于docker搭建Jenkins以及基本使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Docker容器輸入漢字觸發(fā)自動(dòng)補(bǔ)全問題

    Docker容器輸入漢字觸發(fā)自動(dòng)補(bǔ)全問題

    Linux系統(tǒng)中,當(dāng)終端出現(xiàn)中文亂碼通常是由于缺少中文字符集和字體,安裝中文字體和設(shè)置合適的字符集zh_CN.utf8,可以有效解決這一問題,首先,通過查看系統(tǒng)支持的字符集了解是否支持中文,然后安裝相應(yīng)字符集,其次,查看并設(shè)置當(dāng)前系統(tǒng)字符集
    2024-10-10
  • 超詳細(xì)Docker Desktop下安裝rocketmq的教程

    超詳細(xì)Docker Desktop下安裝rocketmq的教程

    這篇文章主要介紹了Docker Desktop下安裝rocketmq,本文內(nèi)容通過圖文操作命令給大家講解的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • centos修改docker網(wǎng)絡(luò)配置方法分享

    centos修改docker網(wǎng)絡(luò)配置方法分享

    本文給大家分享的是centos修改docker網(wǎng)絡(luò)配置的方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2017-03-03
  • docker 限制容器對(duì)CPU的使用

    docker 限制容器對(duì)CPU的使用

    本篇文章主要介紹了docker 限制容器對(duì)CPU的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • docker mysql啟動(dòng)時(shí)執(zhí)行初始化sql

    docker mysql啟動(dòng)時(shí)執(zhí)行初始化sql

    這篇文章主要介紹了docker mysql啟動(dòng)時(shí)執(zhí)行初始化sql問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • docker客戶端訪問harbor及安裝配置更新

    docker客戶端訪問harbor及安裝配置更新

    這篇文章主要介紹了docker客戶端訪問harbor以及harbor的安裝配置更新步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Docker學(xué)習(xí)筆記之docker入門

    Docker學(xué)習(xí)筆記之docker入門

    docker可以類比成window下的VMware。docker有兩個(gè)基本的概念:容器(container)和鏡像(image),分別對(duì)應(yīng)為VMware中的系統(tǒng)鏡像和系統(tǒng)鏡像中運(yùn)行的軟件。docker的強(qiáng)大之處在于VMware只能運(yùn)行幾個(gè)虛擬機(jī)的設(shè)備上docker可以同時(shí)運(yùn)行幾十甚至上百個(gè)虛擬機(jī)。
    2016-11-11

最新評(píng)論

县级市| 乌海市| 嘉义市| 乌什县| 双牌县| 璧山县| 司法| 闸北区| 正安县| 呼图壁县| 周宁县| 灌阳县| 镶黄旗| 朝阳区| 普定县| 长沙市| 湘阴县| 保山市| 色达县| 孟津县| 枝江市| 田林县| 高碑店市| 乌拉特后旗| 五大连池市| 农安县| 盐池县| 东乌珠穆沁旗| 潜江市| 故城县| 大方县| 永年县| 竹山县| 中江县| 大方县| 额济纳旗| 沙湾县| 大同县| 东港市| 保山市| 绥中县|