Docker实践(16) – 引用特定镜像构建镜像

在你构建镜像大多数时候会引用镜像名称,如“node”或”ubuntu”,这个没有任何问题。
如果你引用镜像名称,它有可能tag名称保持一样而镜像被更改了。看起来这自相矛盾,不过它真实发生了!repository名称仅仅是个引用,它有可能被更改指向一个不同的镜像。指定一个带冒号的tag名称也不会消除这种风险,因为安全更新会使用相同的tag来自动重新构建有漏洞的镜像。
大多数时候你会想让它这样做 – 镜像维护者对镜像有所改进,并修补了安全漏洞是一件好事。不过有时候可能会给你带来痛苦。这不仅仅是一个理论上的风险:这已经出现过很多次了,中断了持续交付且很难调试。在Docker早期,镜像会添加和删除软件包(包括,记忆中消失了的passwd命令),使构建镜像突然地中断。

问题

你想确保镜像的构建始终从一个指定的不会被更改的镜像。

解决方法

从一个指定的镜像ID构建。

讨论

对于你想决定确认从一个指定的镜像构建镜像时,可以在Dockerfile中指定镜像ID.
下面是示例:

  1. FROM 8eaa4ff06b53
  2. RUN echo "Built from image id:" > /etc/buildinfo
  3. RUN echo "8eaa4ff06b53" >> /etc/buildinfo
  4. RUN echo "an ubuntu 14.4.01 image" >> /etc/buildinfo
  5. CMD ["echo","/etc/buildinfo"]

像这样从一个指定的镜像ID构建镜像,这个镜像必须已经保存在了本地。Docker registry不会在Docker Hub搜索这个镜像ID的。
注意你引用的镜像不需要tag。你可以从任意层来构建镜像。

标签:Docker 发布于:2019-11-20 19:18:14