docker中的run/cmd/entrypoint的區(qū)別詳解
Dockerfile中run、cmd和entrypoint都能夠用于執(zhí)行命令,下面是三者的主要用途:
run命令執(zhí)行命令并創(chuàng)建新的鏡像層,通常用于安裝軟件包 cmd命令設(shè)置容器啟動后默認執(zhí)行的命令及其參數(shù),但CMD設(shè)置的命令能夠被docker run命令后面的命令行參數(shù)替換 entrypoint配置容器啟動時的執(zhí)行命令,不會被忽略,一定會被執(zhí)行,即使運行 docker run時指定了其他命令。Shell格式和Exec格式運行命令我們可以用下面兩種格式指定run、cmd和entrypoint要運行的命令:
Shell格式: 。例如:yum install -y wget Exec格式: [“executable”, “param1”, “param2”, …]。例如: [“yum”, “install”, “-y”, “wget”]cmd和entrypoint推薦使用exec格式,因為指令的可讀性更強,更容易理解,而run則兩種格式都可以。
Exec格式的坑dockerfile的內(nèi)容如下:
env name morrisentrypoint ['echo', '$name']
這種寫法只會打印出$name,不會進行變量的替換,原因是它只是在執(zhí)行echo命令,并不是執(zhí)行shell。意思是說,我們不是在shell里執(zhí)行echo,只是單純的執(zhí)行echo,所以不會替換變量。
想要改成可執(zhí)行的shell,需要改寫成以下形式
env name morrisentrypoint ['/bin/bash', '-c', 'echo $name']run命令
run指令通常用于安裝應(yīng)用和軟件包。run在當前鏡像的頂部執(zhí)行命令,并通過創(chuàng)建新的鏡像層。Dockerfile中常常包含多個run指令。下面是一個例子:
run yum update && yum install -y bzr cvs git mercurial subversion
yum update和yum install被放在一個run指令中執(zhí)行,這樣能夠保證每次安裝的是最新的包。如果yum install在單獨的run中執(zhí)行,則會使用yum update創(chuàng)建的鏡像層,而這一層可能是很久以前緩存的。
cmd命令cmd指令允許用戶指定容器的默認執(zhí)行的命令。此命令會在容器啟動且docker run沒有指定其他命令時運行。下面是一個例子:
cmd echo 'Hello world'
運行容器docker run -it [image]將輸出:
Hello world
但當后面加上一個命令,比如docker run -it [image] echo hi,cmd會被忽略掉,命令echo hi將被執(zhí)行:
hi
如果存在多個cmd命令,則只會執(zhí)行最后一個cmd命令。
entrypoint命令entrypoint的exec格式用于設(shè)置容器啟動時要執(zhí)行的命令及其參數(shù),同時可通過cmd命令或者命令行參數(shù)提供額外的參數(shù)。entrypoint中的參數(shù)始終會被使用,這是與cmd命令不同的一點。下面是一個例子:
entrypoint ['echo', 'Hello']
當容器通過docker run -it [image]啟動時,輸出為:
Hello
而如果通過docker run -it [image] morris啟動,則輸出為:
Hello morris
再來看一個例子,Dockerfile為:
entrypoint ['echo', 'Hello']cmd ['world']
當容器通過docker run -it [image]啟動時,輸出為:
Hello world
而如果通過docker run -it [image] morris啟動時,輸出為:
Hello morris
entrypoint中的參數(shù)始終會被使用,而cmd的額外參數(shù)可以在容器啟動時動態(tài)替換掉。
同樣的,如果存在多個entrypoint命令,則只會執(zhí)行最后一個entrypoint命令。
總結(jié) 使用run指令安裝應(yīng)用和軟件包,構(gòu)建鏡像。 如果Docker鏡像的用途是運行應(yīng)用程序或服務(wù),比如運行一個MySQL,應(yīng)該優(yōu)先使用Exec格式的entrypoint指令。cmd可為entrypoint提供額外的默認參數(shù),同時可利用docker run命令行替換默認參數(shù)。 如果想為容器設(shè)置默認的啟動命令,可使用cmd指令。用戶可在docker run命令行中替換此默認命令。到此這篇關(guān)于docker中的run/cmd/entrypoint的區(qū)別詳解的文章就介紹到這了,更多相關(guān)docker run/cmd/entrypoint內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
