天天看點

Dockerfile詳細解析(六)——RUN

RUN

RUN 有2種形式:

  • RUN <command>

    (shell視窗,指令是可以在shell裡面運作,預設是使用 /bin/sh -c 在Linux 或 cmd /s /c 在 Windows)
  • RUN ["executable", "param1", "param2"]

    (exec form)

    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檔案系統時。例如,你可能在嘗試使用

    rm

    一個檔案時會留意到。對于具有最近的aufs版本的系統(例如,可以設定

    dirperm 1

    挂載選項),docker将嘗試通過使用

    dirperm 1

    選項挂載層來自動修複問題。有關

    diperm 1

    選項的更多詳細資訊,請參見

    aufs

    手冊。