Search code examples
node.jsdockerfig

Fig up: Cannot find module - docker run works


I'm trying to run fig up with a minimal node app.

(edited: removed volumes from fig.yml)

fig.yml:

example:
  build: .
  command: node server.js
  ports:
   - "4000:4000"
  links:
   - postgres
postgres:
  image: postgres

Dockerfile:

FROM node

ADD . /src
WORKDIR /src
RUN npm install

server.coffee:

express = require 'express'
app = express()

app.get "/", (req, res) ->
  res.send "Hello World"

server = app.listen 4000, () ->
  console.log 'Listening on port %d', server.address().port

fig build proceeds as expected. fig up fails with:

example_1  | module.js:340
example_1  |     throw err;
example_1  |           ^
example_1  | Error: Cannot find module '/src/server.js'
example_1  |     at Function.Module._resolveFilename (module.js:338:15)
example_1  |     at Function.Module._load (module.js:280:25)
example_1  |     at Function.Module.runMain (module.js:497:10)
example_1  |     at startup (node.js:119:16)
example_1  |     at node.js:906:3

What I don't understand is that I can run the server in a container (that fig built) without fig:

$ docker run -it dockerexample_example /bin/bash
root@58d25759047a:/# node /src/server.js 
Listening on port 4000

Or

$ docker run -it dockerexample_example
Listening on port 4000

Or

$ docker run -it -p 4000:4000 dockerexample_example
Listening on port 4000

What is different about the way fig is trying to run this container?

These files are available here: https://github.com/skyl/docker-example


Solution

  • The difference is the volumes. In the docker run examples you aren't specifying any volumes, but in your fig.yml you are mounting the current working directory to /src in the container, so the /src that was added during build is masked by the volume, and the node_modules are not available.

    I think you should be fine to remove the volumes from the fig.yml, otherwise you'll have to run the npm install outside of the container as well.