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

Bash script fails to run node on docker image

我有一个应用程序,我想 运行 在一个独立的 Docker 图像上。 我在 Ubuntu based image, but the same script now causes me trouble on Alpine 上 运行ning 很好。

这是我的 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 一切 运行s 中按预期进行。

我也尝试过这样简化我的脚本:

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

但同样的问题发生了。

知道会出什么问题吗?当通过 startApp 脚本 运行ning 时,什么会使我的 /data 文件夹不可用?难道是Alpine特有的?

谢谢,

您收到的错误消息看起来像典型的回车 return 问题,因为 app.js 之后的引号已移至行首

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

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

我通常默认所有 projects/files/editors/git 为 Unix \n 除非有特定要求。

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