根据命令的输出重建 docker 图像

Rebuild a docker image depending on the output of a command

假设我想在某个存储库中有新的编译器版本时重建我的 docker 图像。

我可以收集到容器内的版本:

FROM centos:7
RUN yum info gcc | grep Version | sort | tail -1 | cut -d: -f2 | tr -d ' '

如果我构建此容器并将其标记为 base,我可以使用该信息并设置第二个容器:

FROM base
RUN yum install gcc-4.8.5
当编译器版本未更改时,

Docker 将能够缓存第二个容器而不是重建它。但是创建它需要一些 shell 脚本,并且在例如持续集成场景中可能很脆弱。

我想做的是为这两个容器引入一个统一的源。有没有办法写这样的东西:

FROM centos:7
$GCC_VERSION=RUN yum info gcc | grep Version | sort | tail -1 | cut -d: -f2 | tr -d ' '
RUN yum install gcc-$GCC_VERSION

并在 docker build 期间扩展变量(并且仍然缓存命令)?

可以使用ARG指令。构建参数以您想要的方式影响缓存:Impact on build caching

使用这样的 Dockerfile:

FROM centos:7
ARG GCC_VERSION
RUN yum install -y gcc-$GCC_VERSION

图像只有在 GCC_VERSION 发生变化时才会重建。

docker build --build-arg GCC_VERSION=$(docker run centos:7 yum info gcc | grep Version | sort | tail -1 | cut -d: -f2 | tr -d ' ') .