Dockerfile RUN指令 語法解析

2021-10-10 07:19:00 字數 4050 閱讀 1914

docker通過dockerfile建立映象時,runcmd是相當重要的命令,本文對這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指令的快取可由addcopy指令置為無效。

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...