Dockerfile参考(7) – RUN执行命令指令

RUN指令有两种形式:

  • RUN [shell形式,运行在shell的命令,默认是Linux上的/bin/sh -c或windows的cmd /S /C]
  • RUN [“executable”, “param1”, “param2”][exec形式]
  • RUN指令将在当前镜像层上面的一个新数据层执行命令并提交其结果。这个新提交的镜像层将用于Dockerfile的下一步。
    分层RUN指令和生成提交符合Docker的核心概念,其中提交成本低,可以从镜像历史中的任何点创建容器,就像源代码控制一样。
    exec形式避免了shell字符的模糊处理,并且可以在没有特定shell的base镜像上使用RUN指令。
    shell形式中默认的shell可以使用SHELL命令更改。
    在shell形式中你可以使用\反斜杠在下一行继续这个RUN指令。例如下面两行:

    1. RUN /bin/bash -c 'source $HOME/.bashrc; \
    2. echo $HOME'

    两行相当于:

    1. RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

    注意:要在exec形式中使用不同的shell,而不是/bin/sh,传递想用的shell即可,如,[“/bin/bash”, “-c”, “echo hello”]

    注意:exec形式是接一个JSON数组,意味着在单词之外使用双引号而不是单引号。

    注意:不像shell形式,exec形式不会调用一个shell再执行命令。意味着常规shell处理不会发生。例如,RUN [ “echo”, “$HOME” ]不会替换$HOME为家目录。如果你想处理此情况,可以直接使用shell形式或直接执行一个shell。如RUN [ “sh”, “-c”, “echo $HOME” ]。

    注意:在JSON格式中,有必要转义反斜杠,特别是windows中使用反斜杠作为路径分隔符的情况。[“c:\windows\system32\tasklist.exe”] 会视为shell形式,因为这不是一个有效的JSON格式,正确的语法是RUN [“c:\\windows\\system32\\tasklist.exe”]。

    RUN指令的缓存不会在下一次构建镜像时自动失效。一个指令的缓存如RUN apt-get dist-upgrade -y会在下一次构建中重用。可以使用–no-cache参数来使RUN指令的缓存失效,例如docker build –no-cache。

    标签:Docker 发布于:2019-11-19 23:00:57