Bash脚本无法在Docker镜像上运行节点

我有一个应用程序,我想在一个自包含的Docker镜像上运行。 我已经在基于Ubuntu的图像上运行得很好,但是现在的脚本现在让我在Alpine上遇到了麻烦。

这是我的docker文件:

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" ] 

我的startApp脚本比较简单:

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

但是当我尝试运行它时,出现以下错误:

 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 

无论是自动运行,还是直接在使用shell的映像中,都会发生这种情况。

我已经检查过,一切都正确放置在数据文件夹中。 另外,如果我在sh shell中直接运行所有命令,那么所有的命令都按预期运行。

我也试图简化我的脚本:

 #!/bin/sh rethinkdb --bind all & sleep 1; node dbCreate.js; sleep 2; node app.js 

同样的问题发生。

任何想法可以出错? 什么可以使我的/数据文件夹通过startApp脚本运行时不可用? 难道这是来自阿尔派的特异性吗?

谢谢,

您收到的错误消息看起来像一个经典的回车问题,因为app.js后的报价已移到行的开始

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

节点通常应该能够处理这两个行结束,但shell脚本不那么好。

我通常默认所有的项目/文件/编辑/ Git到Unix \n除非有特定的要求不太。

您可以使用dos2unix转换现有文件,或者在jlengrandfind的问题中find答案之一。 我喜欢perl -pi -e 's/\r\n/\n/g' ,因为pie