0

我有一个要在单个自包含 Docker 映像上运行的应用程序。我让它在基于Ubuntu 的映像上运行良好,但现在相同的脚本在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

但是同样的问题也会发生。

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

谢谢,

4

1 回答 1

1

您收到的错误消息看起来像是一个经典的回车问题,因为后面的引用app.js已移至行首

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

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

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

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

于 2016-08-05T07:30:59.700 回答