docker构建运行命令两次吗?

时间:2017-02-17 17:55:17

标签: docker docker-compose dockerfile

在Dockerfile中我有一个FROM子句加载基本图像,比如

FROM mysql:5.7

在mysql的Dockerfile中运行apt-get update之类的命令,但我不明白为什么我需要在自己的Dockerfile中的FROM语句之后运行apt-get update?我知道我需要运行apt-get更新,因为后续命令失败直到我运行apt-get,但我认为FROM镜像已经运行了这些命令?

1 个答案:

答案 0 :(得分:0)

查看Dockerfile for mysql,您会在几个RUN命令上看到如下图案:

RUN apt-get update \
 && apt-get install -y --no-install-recommends \
      ca-certificates \
      wget \
 && rm -rf /var/lib/apt/lists/*

第一行收集包repos的当前状态,然后运行install,最后从文件系统中删除包repo状态。这是在best practices from Docker之后,以防止两个问题:

  1. 在同一个运行命令中清理不需要的文件,以防止图像层膨胀。
  2. 删除最终会变得陈旧并导致错误的缓存数据,一旦它变得陈旧,就会重复使用。
  3. 常见错误是尝试使用两个单独的RUN命令将apt-get updateapt-get install分开。由于docker如何缓存层,如果apt-get update命令与很久以前运行的命令相同,则docker将重用缓存的结果。如果您随后更改apt-get install命令以包含不同的包,则您将发现该映像将无法构建,因为缓存的更新命令指向不再位于包存储库中的映像。