docker - docker build 会运行两次命令吗?

标签 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 镜像已经运行了这些命令?

最佳答案

看着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 的当前状态,然后运行安装,最后从文件系统中删除包 repo 状态。这是在 best practices from Docker 之后防止两个问题:
  • 在同一运行命令中清理不需要的文件,以防止图像层膨胀。
  • 删除最终会变得陈旧并导致错误的缓存数据,一旦它变得陈旧,它应该被重用。

  • 常见的错误是试图分离 apt-get update来自 apt-get install使用两个单独的 RUN 命令。由于 docker 缓存层的方式,如果 apt-get update 命令与很久以前运行的命令相同,docker 将重用缓存的结果。如果您随后更改 apt-get install命令包含不同的包,你会发现图像将无法构建,因为缓存的更新命令指向不再在包存储库中的图像。

    关于docker - docker build 会运行两次命令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42304494/

    相关文章:

    docker - 为我的数据库创建Docker容器

    docker - 如何从 Sveltekit 应用构建 docker 镜像

    docker - 如何访问另一个容器的Docker日志

    docker-compose:差异运行、执行以及层会发生什么

    php - 如何在docker容器中启用php的mysql扩展?

    docker - 如何将环境变量从docker-compose传递到项目?

    docker - Traefik与OSX上的Docker-遵循官方说明的网关超时

    docker - 创建 Dockerfile image/bin/sh : apt-get: not found 失败

    docker - 使用 docker 命令创建文件并提交更改后无法查看文件

    docker - 在terraform中使用注册表中的docker镜像