2016-08-05 9 views
0

私は自分自身に含まれている単一のDocker画像で実行したいアプリケーションを持っています。 私はUbuntu based imageでうまく動作していましたが、同じスクリプトではAlpineに問題が発生します。ここでBashスクリプトがドッカー画像上でノードを実行できない

は私のドッキングウィンドウのファイルです:

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

しかし、私はそれを実行しようとすると、私は次のエラーを取得する:

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スクリプトは比較的簡単です

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 

これは自動的に実行するか、シェルを使用してイメージ内で直接実行するかにかかわらず発生します。

データフォルダにすべてが正しく配置されていることを確認しました。 さらに、shシェルですべてのコマンドを順番に実行すると、すべてが期待通りに実行されます。

私はまた、のような私のスクリプトを簡素化しようとしています。同じ問題が起こる府

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

何が問題になりますか? startAppスクリプトを使用して実行しているときに、/ dataフォルダを使用できなくなる可能性がありますか?それはアルパインからの特異性であろうか?

おかげで、

+1

しかし、1つの提案として、すべてのものを単一のドッカー画像に入れないでください。 'microservices'と考えてください - 単一のドッカーコンテナは1つのことをすべきです。 NodeJSアプリケーション用のコンテナとRethinkDB用のコンテナが必要です。これらのコンテナを簡単にオーケストレーションするには、 'docker-compose'を使用します。つまり、ドッカーベースのアプリケーションが動作するはずです。 – huygn

+0

ねえ@HuyGiang。はい、あなたはまったく正しいです、それは私たちもやりたいことです。これは必要な中間ステップと考えてください:)。 – jlengrand

+0

イメージをビルドするのがはるかに簡単なので、ノードとRethinkDBの両方の公式イメージがあり、カスタム起動スクリプトなしでノードコンテナを簡単にデバッグできます。 – huygn

答えて

1

あなたはapp.js後に引用符として古典的なキャリッジリターンの問題のようなルックスをされるエラーメッセージは、ノードが正常に対処することができるはず

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

行の先頭に移動しましたどちらの行の終わりでもシェルスクリプトはあまり親切ではありません。

特定の要件がない限り、一般的にすべてのプロジェクト/ファイル/エディタ/ gitをUnix \nにデフォルト設定します。

dos2unixまたはquestion jlengrand foundの回答のいずれかを使用して、既存のファイルを変換することができます。私はが好きです。pie

+0

確かに。この問題は、startApp.shスクリプトのWindowsキャリッジリターンから発生していました。私はここで説明されている方法を使用してホスト側で削除しました:http://stackoverflow.com/questions/2613800/how-to-convert-dos-windows-newline-crlf-to-unix-newline-n-in- bash-script – jlengrand

+0

興味のある方は、 'node'の引数に基づいてファイルを要求していますか?私はキャリッジリターンがどのようにモジュールローダーに入ったのか把握しようとしています。 – Matt

+0

いいえ、私がスクリプトで行っているのは、ノードapp.jsを呼び出すことだけです。私はノードスクリプトに触れていません。私はちょっとびっくりしていて、それは十分で、tbhだし、ノード・アプリケーションもunixifyしなければならないと予想していました。 – jlengrand

関連する問題