我有一个应用程序,我想在一个自包含的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的特异性吗?
感谢,
尽管有一个建议,不要把所有东西放在一个码头图像上。想'微服务' - 一个码头集装箱应该只做一件事。你应该为你的NodeJS应用程序提供一个容器,而为RethinkDB提供另一个容器。您可以使用docker-compose来轻松地编排这些容器,这就是基于Docker的应用程序应该如何工作。 – huygn
嘿@HuyGiang。是的,你是完全正确的,这也是我们想要做的。考虑这是一个必要的中间步骤:)。 – jlengrand
我会从一开始就以2个独立的容器开始,因为构建映像会容易很多,Node和RethinkDB都有官方映像,并且无需自定义启动脚本就可以更轻松地调试Node容器。 – huygn