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 :

  • Docker container: MongoDb Insufficient free space for journal files
  • Kubernetes pod fails while making call to google cloud pub/sub with unknown certificate autority
  • Unable to find image 'xxxx' locally
  • Docker calling unit tests
  • Docker run giving different result to docker build (trying to use 32bit image on 64bit host)
  • How to mount a folder in a container as locally
  • FROM julienlengrand/alpine-node-rethinkdb
    
    # Preparing
    # RUN ln -snf /bin/bash /bin/sh
    
    # # Define mountable directories.
    VOLUME ["/data"]
    
    # # Define working directory.
    WORKDIR /data
    
    # # 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 8080
    #EXPOSE 28015
    #EXPOSE 29015
    
    # Expose node app ports
    EXPOSE 4567
    
    CMD [ "/bin/sh", "/data/startApp.sh" ]
    

    My startApp script is relatively simple :

    #!/bin/sh
    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:

    module.js:442
        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 :

    #!/bin/sh
    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?

    Thanks,

  • How to use docker in a gitlab-ci job?
  • What is the overhead of creating docker images?
  • Using loop devices in docker without --privileged flag
  • How to separate ffmpeg and php container in docker
  • How to run Tensorboard and jupyter concurrently with docker?
  • docker python custom module not found
  • One Solution collect form web for “Bash script fails to run node on docker image”

    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

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.