diff --git a/content/get-started/docker-concepts/building-images/using-the-build-cache.md b/content/get-started/docker-concepts/building-images/using-the-build-cache.md index bbe9a328221..b73e2a713dc 100644 --- a/content/get-started/docker-concepts/building-images/using-the-build-cache.md +++ b/content/get-started/docker-concepts/building-images/using-the-build-cache.md @@ -314,11 +314,74 @@ In this hands-on guide, you will learn how to use the Docker build cache effecti By following these optimization techniques, you can make your Docker builds faster and more efficient, leading to quicker iteration cycles and improved development productivity. +## Alert in development: Dealing with dependencies in development + +In previous examples we saw the importance of layer caching to deal with dependencies when packaging the application within the container, being an ideal scenario for production environments. + +But remember, in development environments most of the time the application code is shared with the container through [`volumes`](/engine/storage/volumes/#start-a-container-with-a-volume), and is not copied into the image through Dockerfile + +In these cases: +Do not run your package manager (NPM, Composer, Maven, Pip, etc.) inside the image, leave the installation to **CMD** or **ENTRYPOINT**. This is important so that the volume that we will normally share when developing does not overwrite the files installed by the package manager in the Dockerfile. + +Exemple, In an application with this structure: + +- app.js +- package.json +- Dockerfile +- docker-compose.yaml +- entrypoint.sh + +**Dockerfile** +```dockerfile +FROM node + +WORKDIR /app + +RUN mkdir -p /dockerfiles + +COPY ./entrypoint.sh /dockerfiles/entrypoint.sh + +RUN chmod +x /dockerfiles/entrypoint.sh + +ENTRYPOINT [ "/dockerfiles/entrypoint.sh" ] +``` + +**entrypoint.sh** +```shell +#!/bin/bash + +npm install + +tail -f /dev/null +``` + + +**docker-compose.yaml**: +```ỳaml +services: + node: + build: . + container_name: node + volumes: + - .:/app + networks: + - default + +networks: + default: + driver: bridge +``` + +The volume is sharing all the application code from your machine with the container, completely overwriting the installation of dependencies made within the Dockerfile. + +The installation of the dependencies must be persisted in the volume that was created to handle the application code, in this case, the **ENTRYPOINT** will install the dependencies when the container is started. + ## Additional resources * [Optimizing builds with cache management](/build/cache/) * [Cache Storage Backend](/build/cache/backends/) * [Build cache invalidation](/build/cache/invalidation/) +* [Volumes](/engine/storage/volumes/#start-a-container-with-a-volume) ## Next steps