Basically, a conventional Docker CI build process looks like the following in what I use (where <tag> is something like branch-foobar):
1. docker login <repo>
2. docker pull <repo>/<image>:<tag> || true
3. docker pull <repo>/<image>:branch-master || true
3. docker build --pull --cache-from <repo>/<image>:<tag> --cache-from <repo>/<image>:<master> -f Dockerfile.<branch> -t <repo>/<image>:<tag> .
4. docker push <repo>/<image>:<tag>
Using --cache-from cuts down dramatically on the build times since (assuming your branch-master tag gets rebuilt nightly) at least the Dockerfile layer steps for downloading the base OS image and installing software can be automatically skipped.
But still, even swapping out the last step in the Docker build makes it necessary to pull the entire image first - assuming your average Java application, that's like 500+ MB for OS+Java JRE+OS dependencies. If you're sure that the change is only in the last COPY/ADD step, you still have to pull the image despite it not being needed technically.