简体   繁体   中英

npm install 4x slower in docker container compared to host machine

I'm trying to provision a project locally that's using NodeJs with NPM.

I'm running npm install on my host machine (MacBook Pro Retina, 15-inch, Mid 2015) using nvm with node version 10.19 :

added 2335 packages from 985 contributors and audited 916010 packages in 61.736s

When I run the same setup in Docker, the result is much slower. This is my docker-compose.yml file:

version: '3.4'
services:
  node:
    image: node:10.19-alpine
    container_name: node
    volumes:
      - .:/app/
      - npm-cache:/root/.npm
    working_dir: /app
    command: ["tail", "-f", "/dev/null"]

volumes:
  npm-cache:
    external: false

Then I execute:

 docker-compose up -d node; docker exec -t node npm install

And the result is:

added 2265 packages from 975 contributors and audited 916010 packages in 259.895s

(I'm assuming the number of resulting packages is different due to a different platform).

I thought the speedy installation was achieved by having a local cache (that's why there is an extra volume for caching in the docker-compose) but then I ran:

$ npm cache clean --force && rm -rf ~/.npm && rm -rf node_modules

and the result for installation on the host machine is still consistently ~60 seconds.

When it comes to resources allocated to the Docker VM, it shouldn't be a problem, here's my Docker VM configuration:

码头工人设置 码头工人版本

I don't know where else to look, any help would be greatly appreciated.

Thanks

This slowdown is caused by sharing files between a container and your host machine. In order to cope with it, you can give a try to docker-sync .

This tool supports different strategies for automatical syncing between a host machine and containers (including rsync ).

However, beware that it has own issues like occasional sync freezing.

Here is how I got around the issue.

Create a base docker image using a similar Dockerfile.

FROM node:latest

RUN mkdir -p /node/app
COPY ./package.json /node/app/package.json

WORKDIR "/node/app"
RUN yarn install --network-timeout 100000

Then in your container, make this script the entry point:

#!/bin/bash

mkdir -p /node/app
cp /srv/package.json /node/app
cd /node/app
yarn install

sleep 1
rm -f /srv/node_modules
ln -s /node/app/node_modules /srv/node_modules

cd /srv
sleep 1
yarn serve

This installs npm modules in another directory that is not synced between container and host, and links the directory for the app. This seems to work just fine until this is properly resolved by Docker.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM