Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker: mounting volume and run node apps

For the first time I am trying to use docker for development purpose. I have a node apps .I want to run the apps from docker. Here is my dockerfile:

FROM node:6.0.0-slim
MAINTAINER pyprism

# Prepare app directory
RUN mkdir -p /src/

# Install dependencies
WORKDIR /src/

VOLUME .:/src/

RUN npm install

# Build the app
# RUN npm build

# Expose the app port
EXPOSE 8000

# Start the app
CMD npm start

and docker-compose file:

web:
  build: .
  ports:
    - '8000:8000'

But when I run docker-compose up I got this errors:

Building web
Step 1 : FROM node:6.0.0-slim
 ---> 7bf50b1ad9da
Step 2 : MAINTAINER pyprism
 ---> Running in d1defd389fe6
 ---> b684686c614d
Removing intermediate container d1defd389fe6
Step 3 : RUN mkdir -p /src/
 ---> Running in 36b64560f88f
 ---> 8eb6847d67e4
Removing intermediate container 36b64560f88f
Step 4 : WORKDIR /src/
 ---> Running in 00d4c1fd2cf5
 ---> 88a54e6af176
Removing intermediate container 00d4c1fd2cf5
Step 5 : VOLUME .:/src/
 ---> Running in dc0e9d9d973a
 ---> b558f03ce63c
Removing intermediate container dc0e9d9d973a
Step 6 : RUN npm install
 ---> Running in 09445786b71e
npm info it worked if it ends with ok
npm info using [email protected]
npm info using [email protected]
npm info lifecycle undefined~preinstall: undefined
npm info linkStuff !invalid#1
npm info lifecycle undefined~install: undefined
npm info lifecycle undefined~postinstall: undefined
npm info lifecycle undefined~prepublish: undefined
npm WARN enoent ENOENT: no such file or directory, open '/src/package.json'
npm WARN src No description
npm WARN src No repository field.
npm WARN src No README data
npm WARN src No license field.
npm info ok 
 ---> 8c544294e6c5
Removing intermediate container 09445786b71e
Step 7 : EXPOSE 8000
 ---> Running in 965e192bc67e
 ---> daaf52fac6ca
Removing intermediate container 965e192bc67e
Step 8 : CMD npm start
 ---> Running in 890549e3aea7
 ---> 19a3dc786cee
Removing intermediate container 890549e3aea7
Successfully built 19a3dc786cee
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating redux_web_1
Attaching to redux_web_1
web_1  | npm info it worked if it ends with ok
web_1  | npm info using [email protected]
web_1  | npm info using [email protected]
web_1  | npm ERR! Linux 4.4.0-22-generic
web_1  | npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "start"
web_1  | npm ERR! node v6.0.0
web_1  | npm ERR! npm  v3.8.6
web_1  | npm ERR! path /src/package.json
web_1  | npm ERR! code ENOENT
web_1  | npm ERR! errno -2
web_1  | npm ERR! syscall open
web_1  | 
web_1  | npm ERR! enoent ENOENT: no such file or directory, open '/src/package.json'
web_1  | npm ERR! enoent ENOENT: no such file or directory, open '/src/package.json'
web_1  | npm ERR! enoent This is most likely not a problem with npm itself
web_1  | npm ERR! enoent and is related to npm not being able to find a file.
web_1  | npm ERR! enoent 
web_1  | 
web_1  | npm ERR! Please include the following file with any support request:
web_1  | npm ERR!     /src/npm-debug.log
redux_web_1 exited with code 254
like image 838
pyprism Avatar asked May 08 '16 16:05

pyprism


2 Answers

I am adding this answer just in case the accepted solution does not work for others as it did not for me. Though I confess I am NOT a docker nor a node expert.

This is what I had: Dockerfile

FROM node

WORKDIR /usr/src/

RUN npm install

EXPOSE 4200

CMD npm start

docker-compose.yml

version: "3.2"
services:
  frontend:
    ports:
      - "4200:4200"
    volumes:
      - ./frontend/:/usr/src

To make it work for me I had to remove RUN npm install from the Dockerfile and change the cmd to CMD npm install && npm start

I think the issue is that the volume is not mounted when RUN executes, but is only mounted right before CMD. Also note that you will have to re-build your image after editing Dockerfile.

This did work for me but again, I am no expert. So if anyone has any thoughts or ideas please feel free to explain in the comments or edit to improve the answer.

like image 187
tempcke Avatar answered Nov 17 '22 08:11

tempcke


You can't do this VOLUME .:/src/ in a dockerfile. It's not legal syntax to specify a host mount point in a dockerfile as it would render it host dependent. Move the volume mapping definition to your docker-compose.yml file.

like image 31
johnharris85 Avatar answered Nov 17 '22 08:11

johnharris85