docker通過dockerfile
建立映象時,run
和cmd
是相當重要的命令,本文對這run
指令進行解析。
run 語法
# shell形式,命令在shell中執行,預設情況下,linux是/bin/sh -c、windows是cmd /s /c .
run # exec形式.
run ["executable", "param1", "param2"]
run 語義·run指令在當前映象的頂層上新建層執行命令,同時提交執行結果。提交的結果會在接下來的dockerfile處理。
·分層run
指令和生成提交符合docker的核心理念,即:提交便利,容器可以依據任意歷史映象構建,像源**管理一樣。
·exec
形式能夠避免shell
形式表達含義模糊的問題,同時能夠在乙個不包含shell
命令的基礎映象上執行run
指令。
·shell
形式的預設shell
可以通過shell
修改。
·shell
形式中,若是指令引數過長,可以使用\
換行顯示。
# run 引數不換行.
run /bin/bash -c 'source $home/.bashrc; echo $home'
# run 引數換行.
run /bin/bash -c 'source $home/.bashrc; \
echo $home'
·exec
形式是按照json array格式解析,意味著必須是使用雙引號(")包含引數,而不能使用單引號(』)。
·與shell
形式不同,exec
形式不會呼叫shell
命令列,意味著不會進行shell
處理。例如:執行run [ "echo", "$home" ]
不會對$home
進行變數替換。如果需要shell
處理,那麼可以使用shell
形式或直接執行shell
,例如:run["sh","-c","echo $home"]
。當使用exec
形式直接執行shell
時,與shell
形式類似,應用的shell
是宿主機而非docker。
·json形式,必須轉義反斜槓\
。windows系統中,反斜槓\
是路徑分隔符,是需要特別關注的。否則,由於不是有效的json,執行時會出現異常從而失敗。
run ["c:\windows\system32\tasklist.exe"]
此示例的正確語法是:
run ["c:\\windows\\system32\\tasklist.exe"]
·run
指令的快取不會在下次構建時自動失效。run apt-get dist-upgrade -y
指令的快取將在下次構建時重用。run
指令的快取可以通過使用--no-cache
標誌置為無效,例如:docker build --no-cache
。
·run
指令的快取可由add
和copy
指令置為無效。
run 示例
·公共倉庫中nginx:latest
映象預設不包含vim
軟體包。
1)拉取nginx:latest映象。
2)檢視映象資訊。
docker images
3)指定映象啟動容器。
docker run --name securitit-nginx -d -p 80:80 nginx:latest
4)檢視容器資訊。
docker ps -a
5)進入容器內部,並輸出vim
命令,確認vim
是否安裝。
docker exec -it 1c8022c90ec4 /bin/bash
·通過run指令構建新的映象,使映象帶有vim命令。
1)進入/securitit/dockerfile/目錄(根據個人選擇,這是本文使用的目錄),建立dockerfile
檔案。
from nginx:latest
maintainer securitit
run /bin/bash -c 'apt-get update && apt-get -y install vim'
cmd /bin/bash
2)執行如下的構建命令,基於dockerfile
構建映象。
3)檢視映象資訊。
4)指定通過dockerfile生成的映象啟動容器。
docker run --name securitit-nginx-run -it -d -p 10081:80 securitit-nginx-run:1.0.0.1
5)檢視容器資訊。
docker ps -a
6)進入容器內部,輸出vim -version
,可以看到vim
命令已成功安裝。
總結通過文中的兩個例子,可以看到,通過run
指令可以對基礎映象進行一層改造,例如安裝軟體、修改配置等等內容,使得最終生成的映象具有構建過程中涉及run
的內容。
若文中存在錯誤和不足,歡迎指正!。
arm指令 ldr指令
ldr指令ldr作為指令 偽指令在arm彙編中。ldr指令格式 ldr 目的暫存器,儲存器位址 ldr r0,r1 將儲存器位址為r1的字資料讀入暫存器r0。ldr r0,r1,r2 將儲存器位址為r1 r2的字資料讀入暫存器r0。ldr r0,r1,8 將儲存器位址為r1 8的字資料讀入暫存器r0...
vim指令,linux指令
在normal模式 也就是按了esc 下 u 撤銷上一次操作 0 到本行的開頭 到本行第乙個字元的開頭 到本行的結尾 w 到下乙個單詞的開頭 e 到下乙個單詞的結尾 zz wq 儲存並退出 gg 到文章的開頭 3g 到文章的第三行 g 到文章的結尾 abc 在游標以後的位置找到abc這個字元。此時按...
jsp指令的include指令
include指令為檔案載入指令。被載入的檔案可以是文字檔案,html檔案,jsp檔案。myjsp1.jsp檔案中的 page contenttype text html charset gb2312 include file a.txt a.txt中的 hello txt 2 在myjsp2.js...