dockerfile 中的 RUN 和 bash 脚本有什么区别?

vbs*_*ssa 5 docker dockerfile

我已经看到许多 dockerfiles 在 RUN 语句中包含所有构建步骤,例如:

RUN echo "Hello" &&
    cd /tmp &&
    mv a.txt b.txt &&
    ...
    and so on...
Run Code Online (Sandbox Code Playgroud)

我的问题是:用单个 bash 脚本替换这些指令有什么好处/缺点,该脚本为我提供突出显示语法、循环功能等?就像是:

COPY ./script.sh /tmp
RUN  bash /tmp/script.sh
Run Code Online (Sandbox Code Playgroud)

进而

RUN echo "Hello" &&
    cd /tmp &&
    mv a.txt b.txt &&
    ...
    and so on...
Run Code Online (Sandbox Code Playgroud)

谢谢!

lar*_*sks 6

主要区别在于,当您将COPYbash 脚本添加到映像中时,它将可以在正在运行的容器中进行检查,而RUN命令则更加不透明。由于其他原因,将命令放入这样的文件中可以说更易于管理:VCS 历史记录中的更改会更加清晰,对于更长或更复杂的脚本,您可能会发现使用脚本中的脚本更容易干净地格式化内容。单独的文件,而不是嵌入到命令中的 Dockerfile 中RUN

否则,结果是相同的(在这两种情况下,您执行的是同一组命令),尽管 和COPYRUN产生额外的图像层(相对于RUN单独的图像层)。

  • 最后一个区别是,“docker History”不会显示 shell 脚本内运行的命令,只会显示您运行的脚本。 (5认同)