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