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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With