根据命令的输出重建 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 ' ') .
假设我想在某个存储库中有新的编译器版本时重建我的 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 ' ') .