使用docker执行自动化的build议

docker工人我很擅长。 我需要你的意见,我应该采取什么样的方法来做到以下几点:

我需要构build一个包X分发tarball 。 显而易见的步骤是:

 $ git clone X && cd X # get source $ ./autogen.sh # install some extra packages for building project $ ./configure $ make $ make test $ make dist # create tarball 

作为应用程序要求的一部分,我需要获得上述每个命令的outputsuccess flag 。 我有以下两种方法:

  • 使用发行版的基本映像制作dockerfile ,并在其中包含上述所有步骤。 最后输出tarball。 如果任何中间步骤失败,该过程将失败。 但使用这种方法,我正在parsing单个命令( make test./configure )的输出中遇到的问题? 此外,我必须使用--no-cache每次构build,因为我正在做git clone而且我的repo频繁更新
  • 其他是我在运行的容器上单独运行上述步骤。 使用这个我可以轻松地parsing一个步骤的输出,然后如果前面的成功进行到下一步。

那么,我应该遵循哪种方法?

这似乎是进入一个意见问题。 这就是说,如果是我,我会做Dockerfile。

  • 先build立一切共同的东西,任何你可以设置的环境,所以这些步骤可以被caching。
  • 在git克隆步骤中插入一个caching破坏参数。 (将时间戳的ARG传递给docker build ,然后RUN STAMP=${TIMESTAMP} git clone 。如果克隆需要太长时间,可以做两个克隆,一个caching,很less更新(每天或每月基于你的喜好),然后拉你每次运行。
  • 将输出parsing器包含在容器中,在RUN命令中运行该parsing器,并在parsing中的任何错误时使用非零代码退出构build。 使用tee命令将所有输出发送到本地日志。
  • 在一个成功的版本上,你可以做一个docker cp将日志从容器中复制出来,如果你需要的话。

我的逻辑来避免一个运行的容器是,它不太可能有一个干净的起始状态,非常容易受到容器上同一testing的第二个并发运行损坏,如果你不重置每一次,你可以有假阳性不知道之前的运行离开了一个初始状态,你不能轻易地在其他地方复制。 Dockerfile也更加便携。