RUN
RUN 有2種形式:
-
(shell視窗,指令是可以在shell裡面運作,預設是使用 /bin/sh -c 在Linux 或 cmd /s /c 在 Windows)RUN <command>
-
(exec form)RUN ["executable", "param1", "param2"]
指令會在目前鏡像之上的新層執行一些指令和送出結果。生成送出的鏡像将會被用于RUN
的下一步.Dockerfile
分層運作指令和生成送出符合Docker的低成本核心概念,送出成本低和容器可以從鏡像曆史的任何點建立,非常像源碼控制。
exec 形式可以盡可能消除shell語句逐漸積累導緻破壞系統,以及可以在不包含指定可執行shell的基礎鏡像上運作指令
使用
SHELL
指令可以改變 shell視窗預設的shell。
在 shell 視窗你可以使用
\
(反斜杠)去銜接一個 RUN 指令行在下一行。例如,考慮使用着2行:
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
在一同一行,它們相當于一個指令:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
注意:使用一個不同的 shell,不同于 ‘/bin/sh’, 使用 exec 形式傳到 想要傳的shell。例如
RUN ["/bin/bash", “-c”, “echo hello”]
注意:exec形式 被轉換成一個 JSON 數組,這意味着你必須使用 雙引号(")包着而不是單引号(’)。
注意: 不像shell形式,exec形式不啟用指令shell。這個意味着正常的 shell 處理過程是不會發生的。例如
RUN [ “echo”, “$HOME” ]'是不會把$HOME變量替換。如果你想 shell 處理那麼可以使用 shell形式或者直接
執行一個shell,例如:RUN [ “sh”, “-c”, “echo $HOME” ]。當使用 exec的形式和直接執行shell,與shell形式的情況
一樣,這個是shell做環變量的擴充而不是docker。
注意:在 JSON形式中,是需要轉義反斜杠。尤其是在Windows上,反斜杠是作為路徑分隔符。否則,由于不合法的
JSON 下面的語句會被當作 shell 形式,并以一中異常的方式失敗:RUN [“c:\windows\system32\tasklist.exe”] 正确的符号
應該如下例子:RUN [“c:\windows\system32\tasklist.exe”]
在下一個建構中
RUN
指令的的緩存是不會自動失效的。在下一個建構中像是指令
RUN apt-get dist-upgrade -y
會被再利用。使用标簽
--no-cache
可以使
RUN
指令的緩存失效,例如
docker build --no-cache
。
檢視
Dockerfile
最佳實踐指南可以獲得更多資訊。
關于
Dockerfile
的緩存,可以通過
ADD
指令是其失效。詳細檢視下面。
已知問題(RUN)
- Issue 783 是關于檔案權限問題,發生再使用AUFS檔案系統時。例如,你可能在嘗試使用
一個檔案時會留意到。對于具有最近的aufs版本的系統(例如,可以設定rm
挂載選項),docker将嘗試通過使用dirperm 1
選項挂載層來自動修複問題。有關dirperm 1
選項的更多詳細資訊,請參見diperm 1
手冊。aufs