Search code examples
javascriptnode.jsdockerdocker-composenpm-install

npm install takes forever when running docker-compose


I am working on a Next.js project with a PostgreSQL database running in a Docker container. My project's setup uses Docker Compose. However, when I run docker-compose up, it takes forever to execute the npm install command. Running npm install locally on my development machine finishes in less than a minute.

In the attached log, you can see that when I run npm i with the log level set to verbose, it appears to hang with no progress after a certain point.

[+] Building 3624.4s (7/8)
 => => transferring context: 34B                                                                                                                                                                                             0.0s
 => [internal] load metadata for docker.io/library/node:latest                                                                                                                                                               1.5s 
 => [internal] load build context                                                                                                                                                                                            0.1s 
 => => transferring context: 906.47kB                                                                                                                                                                                        0.1s
 => [1/4] FROM docker.io/library/node@sha256:xxx                                                                                                                0.0s 
 => CACHED [2/4] WORKDIR /app                                                                                                                                                                                                0.0s
 => [3/4] COPY . .                                                                                                                                                                                                           0.3s 
 => [4/4] RUN npm install --loglevel verbose                                                                                                                                                                              2065.1s 
 => => # npm http fetch GET 200 https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz 137294ms attempt #3 (cache miss)
 => => # npm http fetch GET 200 https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz 137326ms attempt #3 (cache miss)                                                                                  
 => => # npm http fetch GET 200 https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz 137403ms attempt #3 (cache miss)
 => => # npm http fetch GET 200 https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz 137436ms attempt #3 (cache miss)
 => => # npm http fetch GET 200 https://registry.npmjs.org/@types/node/-/node-20.4.1.tgz 137633ms attempt #3 (cache miss)                                                                                                         
 => => # npm http fetch GET 200 https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz 137706ms attempt #3 (cache miss)                                                                   

This is my docker-compose setup:

FROM node

WORKDIR /app

COPY . .
RUN npm install --loglevel verbose

ENV PORT=5000
EXPOSE 5000

ENTRYPOINT ["npm", "start"]

If the information is unclear please let me know.


Solution

  • It's because you aren't taking advantage of Docker caching. Try adding the below to your Dockerfile as detailed here.

    COPY package.json /app
    RUN npm install