We have a base image with the tag latest. This base image is being used for bunch of applications. There might be some update on the base image like ( OS upgrade, ...).
Do we need to rebuild and redeploy all applications when there is a change in the base image? Or, since the tag is latest and the new base image also will be with the tag latest, it will be updating in the docker layer and will be taken care without a restart?
Kubernetes has an imagePullPolicy:
setting to control this. The default is that a node will only pull an image if it doesn’t already have it, except that if the image is using the :latest
tag, it will always pull the image.
If you have a base image and then some derived image FROM my/base:latest
, the derived image will include a specific version of the base image as its lowermost layers. If you update the base image and don’t rebuild the derived images, they will still use the same version of the base image. So, if you update the base image, you need to rebuild all of the deployed images.
If you have a running pod of some form and it’s running a :latest
tag and the actual image that tag points at changes, Kubernetes has no way of noticing that, so you need to manually delete pods to force it to recreate them. That’s bad. Best practice is to use some explicit non-latest version tag (a date stamp works fine) so that you can update the image in the deployment and Kubernetes will redeploy for you.
There are two levels to this question.
Docker
If you use something like FROM baseimage:latest
, this exact image is pulled down on your first build. Docker caches layers on consecutive builds, so not only will it build from the same baseimage:latest
, but it will also skip execution of the Dockerfile elements untill first changed/not-cached one. To make the build notice changes to your baseimage
you need to run docker pull baseimage:latest
prior to the build, so that next run uses new content under latest
tag.
The same goes for versioned tags when they aggregate minor/patch versions like when you use baseimage:v1.2
but the software is updated from baseimage:v1.2.3
to v1.2.4
, and by the same process content of v1.2.4
is published as v1.2
. So be aware of how versioning for particular image is handled.
Kubernetes
When you use :latest
to deploy to Kubernetes you usually have imagePullPolicy: Always
set. Which as for Docker build above, means that the image is always pulled before run. This is far from ideal, and far from immutable. Depending on the moment of container restart you might end up with two pods running at the same time, both the same :latest
image yet the :latest
for both of them will mean different actual image underneath it.
Also, you can't really change image in Deployment
from :latest
to :latest
cause that's no change obviously, meaning you're out of luck for triggering rolling update, unless you pass version in label or something.
The good practice is to version your images somehow and push updates to cluster with that version. That is how it's designed and intended to use in general. Some versioning schemas I used were :
branch-buildnum
or branch-sha-buildnum
: we use it quite a lotthat is not to say I completely do not use latest. In fact most of my builds are built as branch-num
, but when they are released to production that are also tagged and pushed to registry as branch-latest
(ie. for prod as master-latest
), which is very helpful when you want to deploy fresh cluster with current production versions (default tag values in our helm charts are pointing to latest and are set to particular tag when released via CI)