Skip to main content

Docker Compose–Container image is not updated

Yesterday I talked about how we used Docker Compose to build and run an node.js/PostgreSQL application locally.We were using the build section inside the docker compose file to build the container image when running docker compose avoiding the need to build the container image separately.

However when using this approach we noticed that if we made changes to the code, those changes were not picked up by Docker Compose and we were running using an outdated image.

This turned out not to be a bug but requires a better understanding of the different Docker Compose commands.

Docker Compose commands

Docker Compose provides multiple commands and flags and it is important to understand the nuances between each command.

docker compose up

The command that we used so far was docker compose up, This builds the container image if the images does not exist and starts the containers. This already explains the behavior I described above

docker compose build

Another option is docker compose build. This will only build the images, without starting the containers.

docker compose up –-build

This combines the 2 options above and forces to build the image before the containers are started.  It rebuilds all images defined with a build context in your docker-compose.yml file. As it ensures your containers use the latest version of your code and Dockerfile instructions it is the perfect command to use during development when you are frequently changing your containers.

Disable caching

If the commands above don’t provide the expected result, you can go one step further and disable caching when using Docker Compose. By default Docker Compose relies on Docker's layer caching to optimize and speed up the image-building process. This caching mechanism can significantly reduce build times by reusing previously built layers. However, there are scenarios where you might want to bypass the cache and force Docker to build the image from scratch. This is where the --no-cache option comes in handy1.

There are several situations where using the --no-cache option is beneficial:

  1. Updating Dockerfile or Dependencies: If you have made changes to the Dockerfile or updated any dependencies, using --no-cache ensures that these changes are incorporated into the new build1.

  2. Ensuring Up-to-Date Images: For production deployments, rebuilding with --no-cache guarantees that you have the latest image without any stale layers1.

  3. Troubleshooting Build Failures: If you encounter mysterious build errors, using --no-cache can help eliminate caching as a potential cause1.

  4. Base Image Updates: If the base image you are using has been updated, rebuilding with --no-cache ensures that you get the latest base image code1.

To build the images without using the cache, run the following command:

docker compose build --no-cache

This command will force Docker to rebuild every layer from scratch, ignoring any cached layers. As it can result in longer build times and larger image sizes I would recommend to avoid using this option unless you experience issues with the other commands.

Popular posts from this blog

Kubernetes–Limit your environmental impact

Reducing the carbon footprint and CO2 emission of our (cloud) workloads, is a responsibility of all of us. If you are running a Kubernetes cluster, have a look at Kube-Green . kube-green is a simple Kubernetes operator that automatically shuts down (some of) your pods when you don't need them. A single pod produces about 11 Kg CO2eq per year( here the calculation). Reason enough to give it a try! Installing kube-green in your cluster The easiest way to install the operator in your cluster is through kubectl. We first need to install a cert-manager: kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml Remark: Wait a minute before you continue as it can take some time before the cert-manager is up & running inside your cluster. Now we can install the kube-green operator: kubectl apply -f https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml Now in the namespace where we want t...

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

DevToys–A swiss army knife for developers

As a developer there are a lot of small tasks you need to do as part of your coding, debugging and testing activities.  DevToys is an offline windows app that tries to help you with these tasks. Instead of using different websites you get a fully offline experience offering help for a large list of tasks. Many tools are available. Here is the current list: Converters JSON <> YAML Timestamp Number Base Cron Parser Encoders / Decoders HTML URL Base64 Text & Image GZip JWT Decoder Formatters JSON SQL XML Generators Hash (MD5, SHA1, SHA256, SHA512) UUID 1 and 4 Lorem Ipsum Checksum Text Escape / Unescape Inspector & Case Converter Regex Tester Text Comparer XML Validator Markdown Preview Graphic Col...