Dockerfile中run、cmd和entrypoint都能夠用于執行命令,下面是三者的主要用途:
docker run
命令后面的命令行參數替換docker run
時指定了其他命令。我們可以用下面兩種格式指定run、cmd和entrypoint要運行的命令:
cmd和entrypoint推薦使用exec格式,因為指令的可讀性更強,更容易理解,而run則兩種格式都可以。
dockerfile的內容如下:
env name morris entrypoint ["echo", "$name"]
這種寫法只會打印出$name,不會進行變量的替換,原因是它只是在執行echo命令,并不是執行shell。意思是說,我們不是在shell里執行echo,只是單純的執行echo,所以不會替換變量。
想要改成可執行的shell,需要改寫成以下形式
env name morris entrypoint ["/bin/bash", "-c", "echo $name"]
run指令通常用于安裝應用和軟件包。run在當前鏡像的頂部執行命令,并通過創建新的鏡像層。Dockerfile中常常包含多個run指令。下面是一個例子:
run yum update && yum install -y \ bzr \ cvs \ git \ mercurial \ subversion
yum update和yum install被放在一個run指令中執行,這樣能夠保證每次安裝的是最新的包。如果yum install在單獨的run中執行,則會使用yum update創建的鏡像層,而這一層可能是很久以前緩存的。
cmd指令允許用戶指定容器的默認執行的命令。此命令會在容器啟動且docker run沒有指定其他命令時運行。下面是一個例子:
cmd echo "Hello world"
運行容器docker run -it [image]
將輸出:
Hello world
但當后面加上一個命令,比如docker run -it [image] echo hi
,cmd會被忽略掉,命令echo hi
將被執行:
hi
如果存在多個cmd命令,則只會執行最后一個cmd命令。
entrypoint的exec格式用于設置容器啟動時要執行的命令及其參數,同時可通過cmd命令或者命令行參數提供額外的參數。entrypoint中的參數始終會被使用,這是與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中的參數始終會被使用,而cmd的額外參數可以在容器啟動時動態替換掉。
同樣的,如果存在多個entrypoint命令,則只會執行最后一個entrypoint命令。
到此這篇關于docker中的run/cmd/entrypoint的區別詳解的文章就介紹到這了,更多相關docker run/cmd/entrypoint內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!