Webdev Tory Webdev Tory - 1 year ago 84
Node.js Question

Why is my npm dockerfile looping?

I'm containerizing a nodejs app. My Dockerfile looks like this:

FROM node:4-onbuild

ADD ./ /egp

RUN cd /egp \
&& apt-get update \
&& apt-get install -y r-base python-dev python-matplotlib python-pil python-pip \
&& ./init.R \
&& pip install wordcloud \
&& echo "ABOUT TO do NPM" \
&& npm install -g bower gulp \

# CMD npm start > app.log
CMD ["npm", "start", ">", "app.log"]

When I DON'T use the Dockerfile, and instead run

docker run -it -p 5000:5000 -v $(pwd):/egp node:4-onbuild /bin/bash

I can then paste the value of the RUN command and it all works perfectly, and then execute the
npm start
command and I'm good to go. However, upon attempting instead
docker build .
it seems to run in to an endless loop attempting to install npm stuff (and never displaying my echo commands), until it crashes with an out-of-memory error. Where have I gone wrong?


Here is a minimal version of the EGP folder that exhibits the same container: logging in and pasting the whole "RUN" command works, but docker build does not.It is a .tar.gz file (though the name might download without one of the .)


Answer Source

The node:4-onbuild image contains the following Dockerfile

FROM node:4.4.7

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ONBUILD COPY package.json /usr/src/app/
ONBUILD RUN npm install
ONBUILD COPY . /usr/src/app

CMD [ "npm", "start" ]

The three ONBUILD commands run before your ADD or RUN command are kicked off, and the endless loop appears to come from the npm install command that's running. When you launch the container directly, the ONBUILD commands are skipped since you didn't build a child-image. Change your FROM line to:

FROM node:4

and you should have your expected results.