跳转至

Docker build镜像 cache的副作用


2017-07-06 by dongnan

问题描述

使用 docker 构建镜像过程中使用 cache,导致构建后的项目镜像仍然为旧版本 tomcat:9(9.0.0.M18) 而非 指定的 tomcat:9.0.0.M22

docker build 部分日志

Sending build context to Docker daemon 66.97 MB
Step 1/7 : FROM tomcat:9
---> a0f141e26c8a
Step 2/7 : MAINTAINER dongnan
---> Using cache
---> 88f0d1eacbef
#...省略
Step 6/7 : ENV LANG en_US.UTF-8
---> Using cache
---> f7e2f9324636
#...省略
Successfully built 45a576c0b1a8

问题原因

docker 在构建镜像过程中引入了 cache 机制,主要有两方面作用:

  • 镜像的复用,降低存储空间。
  • 镜像构建过程节省大量的时间。

正常构建镜像,这两点是非常有帮助的,但是某些情况下, 例如示例中测试项目新版本镜像,没有触发 docker 更新 cache 的条件。

Docker 考虑到这样的问题,所以在 build 过程中提供了相应参数, --no-cache ,避免 build 过程中使用 cache

解决方法

加上 --no-cache 参数

docker build -t tomcat:9.0.0.M22 --no-cache .

帮助

docker build --help
Usage:    docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
      --build-arg list             Set build-time variables (default [])
      --cache-from stringSlice     Images to consider as cache sources
      --cgroup-parent string       Optional parent cgroup for the container
      --compress                   Compress the build context using gzip
      --cpu-period int             Limit the CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int              Limit the CPU CFS (Completely Fair Scheduler) quota
  -c, --cpu-shares int             CPU shares (relative weight)
      --cpuset-cpus string         CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string         MEMs in which to allow execution (0-3, 0,1)
      --disable-content-trust      Skip image verification (default true)
  -f, --file string                Name of the Dockerfile (Default is 'PATH/Dockerfile')
      --force-rm                   Always remove intermediate containers
      --help                       Print usage
      --isolation string           Container isolation technology
      --label list                 Set metadata for an image (default [])
  -m, --memory string              Memory limit
      --memory-swap string         Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --network string             Set the networking mode for the RUN instructions during build (default "default")
      --no-cache                   Do not use cache when building the image
      --pull                       Always attempt to pull a newer version of the image
  -q, --quiet                      Suppress the build output and print image ID on success
      --rm                         Remove intermediate containers after a successful build (default true)
      --security-opt stringSlice   Security options
      --shm-size string            Size of /dev/shm, default value is 64MB
  -t, --tag list                   Name and optionally a tag in the 'name:tag' format (default [])
      --ulimit ulimit              Ulimit options (default [])



回到页面顶部