As your project grows it can be challenging to make sure that only the necessary files get sent to the Docker daemon.
There are several tips to help you with this.

Use a „build“ directory

Using a .dockerignore file to ignore all files that should not be sent to the docker daemon sounds easy but in large projects this can be quite challenging task, especially if your build tasks get more and grow. I often found it easier to create a single „build“ director during the build process (like grunt, gulp or similar), build and prepare everything into this directory and just use this „build“ directory as the root directory to build the Docker image.

Optimize your .dockerignore file by negation

Sometimes it is not possible to use such a dedicated „build“ directory. In that case you can use a .dockerignore file to specify all files that should not be sent to the docker daemon and thus be ignored during the docker build step. In this .dockerignore file you can list files and directories that should be ignored. But it is very easy to forget to add new files as your project is evolving.
I think it is better to explicitly specify which files should be sent to the docker daemon. You can do so, by adding a negated entry to the .dockerignore for each file or directory that should be included.
It might sound strange to add a negative entry into an ignore-file but it works pretty well.

# ignore everything

# do NOT ignore

# do NOT ignore everything in the build

# but DO ignore the nodemon.json file in the build directory


Check the amount of data you send to the Docker daemon

You can use a special Dockerfile to check which files and directories are sent to the Docker daemon. Create a file Dockerfile-checksize in the directory of your Dockerfile and use the following content:

FROM busybox

RUN mkdir -p copyitems/
WORKDIR copyitems
COPY * ./
RUN ls -als
RUN du -h
RUN du –sh

Use the following command to build the Docker image:

docker build . -f Dockerfile-checksize --no-cache

During the build process you will see which files are sent to the Docker daemon and the size of each directory:

Sending build context to Docker daemon 20.35 MB

Step 1/7 : FROM busybox
Step 2/7 : RUN mkdir -p copyitems/
Step 3/7 : WORKDIR copyitems
Step 4/7 : COPY * ./
Step 5/7 : RUN ls -als
total 1140
     4 drwxr-xr-x    5 root     root          4096 Feb  5 19:01 .
     4 drwxr-xr-x   20 root     root          4096 Feb  5 19:02 ..
     4 -rw-rw-r--    1 root     root            49 Oct  1 12:46 .bowerrc
     4 -rwxrwxr-x    1 root     root           342 Feb  5 11:28
     4 -rwxrwxr-x    1 root     root           966 Oct 16 12:25
    40 -rw-rw-r--    1 root     root         40549 Oct  1 12:52 database-schema.sql
     4 drwxrwxr-x    3 root     root          4096 Oct  1 12:47 docker
     4 -rw-rw-r--    1 root     root           958 Oct 20 12:06
     4 -rw-rw-r--    1 root     root          1723 Feb  5 11:28 package.json
     4 drwxrwxr-x    4 root     root          4096 Feb  5 11:58 src
Step 6/7 : RUN du -h
8.0K	./docker/docker-entrypoint-initdb.d
16.0K	./docker
40.0K	./src/public/html/backend
20.0K	./src/public/html/print
88.0K	./src/public/html/general
360.0K	./src/public/html
1.7M	./src/public/js/lib
2.6M	./src/public/js
148.0K	./src/public/css
2.2M	./src/public/img
5.5M	./src/public
68.0K	./src/lib/common
36.0K	./src/lib/config
8.0K	./src/lib/models
924.0K	./src/lib
6.4M	./src
20.6M	.
Step 7/7 : RUN du -sh
20.6M	.
Successfully built aa603e730b31

(Some Docker log messages are omitted for clarity)
With the output of this build process you can check if you only added the necessary files or if may rework your .dockerignore file.