2016-08-05 65 views
0

我有一个应用程序,我想在一个自包含的Docker映像上运行。 我在Ubuntu based image上运行得很好,但是现在这个脚本在Alpine上给我带来麻烦。Bash脚本无法在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 

BU同样的问题发生。

任何想法可能出错?当通过startApp脚本运行时,什么可能导致我的/ data文件夹不可用?难道它是来自Alpine的特异性吗?

感谢,

+1

尽管有一个建议,不要把所有东西放在一个码头图像上。想'微服务' - 一个码头集装箱应该只做一件事。你应该为你的NodeJS应用程序提供一个容器,而为RethinkDB提供另一个容器。您可以使用docker-compose来轻松地编排这些容器,这就是基于Docker的应用程序应该如何工作。 – huygn

+0

嘿@HuyGiang。是的,你是完全正确的,这也是我们想要做的。考虑这是一个必要的中间步骤:)。 – jlengrand

+0

我会从一开始就以2个独立的容器开始,因为构建映像会容易很多,Node和RethinkDB都有官方映像,并且无需自定义启动脚本就可以更轻松地调试Node容器。 – huygn

回答

1

您收到像一个典型的回车问题作为app.js后的报价看起来错误信息已移动到线的起点

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

节点通常应该能够处理有两个行尾,但shell脚本不那么友好。

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

您可以使用dos2unixquestion jlengrand found中的某个答案转换现有文件。我喜欢perl -pi -e 's/\r\n/\n/g',因为pie

+0

确实。问题来自我的startApp.sh脚本中的Windows回车。我通过使用这里描述的方法在主机端删除它:http://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-n-in- bash脚本 – jlengrand

+0

出于兴趣,您是否需要基于'node'参数的文件?我想弄清楚回车是如何进入模块加载器的。 – Matt

+0

不,我在脚本中唯一要做的就是调用节点app.js.我没有碰过节点脚本。我也有点惊讶,它足够了,tbh,并期望不得不unixify节点的应用程序。 – jlengrand