7

I am building a Docker image using a command line like the following:

docker build -t myimage .

Once this command has succeeded, then rerunning it is a no-op as the image specified by the Dockerfile has not changed. Is there a way to detect if the Dockerfile (or one of the build context files) subsequently changes without rerunning this command?

Richard Cook
  • 31,413
  • 5
  • 44
  • 69

2 Answers2

15

looking at docker inspect $image_name from one build to another, several information doesn't change if the docker image hasn't changed. One of them is the docker Id. So, I used the Id information to check if a docker has been changed as follows:

First, one can get the image Id as follows:

docker inspect --format {{.Id}} $docker_image_name

Then, to check if there is a change after a build, you can follow these steps:

  1. Get the image id before the build
  2. Build the image
  3. Get the image id after the build
  4. Compare the two ids, if they match there is no change, if they don't match, there was a change.

Code: Here is a working bash script implementing the above idea:

docker inspect --format {{.Id}} $docker_image_name > deploy/last_image_build_id.log
# I get the docker last image id from a file
last_docker_id=$(cat deploy/last_image_build_id.log)
docker build -t $docker_image_name .
docker_id_after_build=$(docker inspect --format {{.Id}} $docker_image_name)
if [ "$docker_id_after_build" != "$last_docker_id" ]; then
   echo "image changed" 
else
   echo "image didn't change" 
fi
Mohamed Ali JAMAOUI
  • 13,233
  • 12
  • 67
  • 109
  • 8
    Is there a way to determine whether `docker build` will yield a new image or not _without_ actually building? – Dror Mar 30 '20 at 13:12
7

There isn't a dry-run option if that's what you are looking for. You can use a different tag to avoid affecting existing images and look for ---> Using cache in the output (then delete the tag if you don't want it).

ldg
  • 8,600
  • 2
  • 26
  • 44