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

时间:2016-08-05 06:24:36

标签: node.js shell docker alpine

我有一个应用程序,我想在一个自包含的Docker镜像上运行。 我在Ubuntu based image上运行正常,但同样的脚本现在让我在Alpine上遇到麻烦。

这是我的泊坞文件:

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
发生同样的问题。

知道什么可能出错?什么可以使我/ data文件夹在通过startApp脚本运行时不可用?这可能是阿尔卑斯山的特异性吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

您收到的错误消息看起来像经典的回车问题,因为app.js移动到行首之后的引用

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

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

我通常将所有项目/文件/编辑器/ git默认为Unix \n,除非没有特定要求。

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