執行指令
RUN
有兩種形式:
RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN ["executable", "param1", "param2"] (exec form)
RUN
指令將在當前影象之上的新圖層中執行任何命令並提交結果。生成的提交影象將用於 Dockerfile
中的下一步。
分層 RUN
指令和生成提交符合 Docker 的核心概念,其中提交很便宜,並且可以從影象歷史中的任何點建立容器,就像原始碼控制一樣。
exec 表單可以避免 shell 字串重寫,並使用不包含指定 shell 可執行檔案的基本映像來執行 RUN
命令。
可以使用 SHELL
命令更改 shell 表單的預設 shell。
在 shell 形式中,你可以使用\
(反斜槓)將單個 RUN
指令繼續到下一行。例如,考慮以下兩行:
RUN /bin/bash -c 'source $HOME/.bashrc ;\
echo $HOME'
它們一起相當於這一行:
RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'
注意:要使用除“/ bin / sh”之外的其他 shell,請使用傳入所需 shell 的 exec 表單。例如,RUN ["/bin/bash", "-c", "echo hello"]
注意:exec 表單被解析為 JSON 陣列,這意味著你必須在單詞(‘
)周圍使用雙引號(“
)。
注意:與 shell 表單不同,exec 表單不會呼叫命令 shell。這意味著不會發生正常的 shell 處理。例如,RUN [ "echo", "$HOME" ]
不會對 $HOME
進行變數替換。如果你需要 shell 處理,則可以使用 shell 表單或直接執行 shell,例如:RUN [ "sh", "-c", "echo $HOME" ]
。
注意:在 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 最佳實踐指南。
RUN
指令的快取可以通過 ADD
指令無效。請參閱下文了解詳情。