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 [])