jlengrand jlengrand - 1 year ago 468
Node.js Question

Bash script fails to run node on docker image

I have an app that I want to run on a single self contained Docker image.
I had it running fine on an Ubuntu based image, but the same script now causes me trouble on Alpine.

Here is my docker file :

FROM julienlengrand/alpine-node-rethinkdb

# Preparing
# RUN ln -snf /bin/bash /bin/sh

# # Define mountable directories.
VOLUME ["/data"]

# # Define working directory.

# # Install app dependencies
COPY package.json /data
RUN npm install

# # Bundle app source
COPY . /data

# # Expose rethinkdb ports.
# - 8080: web UI
# - 28015: process
# - 29015: cluster
#EXPOSE 28015
#EXPOSE 29015

# Expose node app ports

CMD [ "/bin/sh", "/data/startApp.sh" ]

My startApp script is relatively simple :

rethinkdb --bind all & sleep 1; node dbCreate.js; sleep 2; nohup node workers/worker.js & node app.js

But when I try to run it, I get the following error:

throw err;

'rror: Cannot find module '/data/app.js
at Function.Module._resolveFilename (module.js:440:15)
at Function.Module._load (module.js:388:25)
at Module.runMain (module.js:575:10)
at run (bootstrap_node.js:352:7)
at startup (bootstrap_node.js:144:9)
at bootstrap_node.js:467:3

This happens whether I run it automatically, or directly within the image using the shell.

I have checked and everything is correctly placed in the data folder.
Additionally, if I run all the commands one after the other directly in the sh shell everything runs as expected.

I have also tried to simplify my script as such :

rethinkdb --bind all & sleep 1; node dbCreate.js; sleep 2; node app.js

bu the same issue happens.

Any idea what can go wrong? What could make my /data folder unavailable when running via the startApp script? Could it be that it is a specificity from Alpine?


Answer Source

The error message you are receiving looks like a classic carriage return issue as the quote after app.js has moved to the start of the line

'rror: Cannot find module '/data/app.js

Node should normally be able to deal with both line endings but shell scripts aren't so kind.

I generally default all projects/files/editors/git to a Unix \n unless there are specific requirements not too.

You can convert existing files with dos2unix or one of the answers in the question jlengrand found. I like perl -pi -e 's/\r\n/\n/g', because pie