執行指令

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 指令無效。請參閱下文了解詳情。