2016-07-09 9 views
1

私のnode.js Webサーバーでtypescriptを使用します。ただし、Web SeverはDocker Containerにあります。私は打撃のようなDockerfileを使用します。 ノードから:最新Dockerでtypescriptをコンパイルできません

COPY code/ /usr/local/lib 
WORKDIR /usr/local/lib 

RUN npm install -g [email protected] 
RUN npm install -g sequelize 
RUN npm install -g mysql 
RUN npm install -g typescript 

CMD ["sh", "-c", "rm", "webApp.js"] 
CMD ["sh", "-c", "tsc", "webApp.ts"] 
CMD ["node", "webApp.js"] 

私はドッカーを構築した後、私はCMDコマンドの後に何webApp.jsが生成されない、ということを見つけます。 なぜ、どのように解決すればよいですか?ありがとう。

答えて

0

私は問題がsh -cだと思います。 コンソールにsh -c echo testと入力すると、出力されません。 sh -c "echo test"と入力するか、echo testと入力するだけで動作します。これは最初の引数だけが実行されるためです(man shを見てください)。

しかし、これ以外にも必要はありません。 CMD ["rm", "webApp.js"]はあなたが望むことをします。そして、あなたはそれがbashのに実行させたい場合は/ shを使用すると、文字列の構文を使用することができますCMD rm webApp.js

+0

あなたの方法は申し訳ございません。それはコマンドフォーマットの問題ではない、私は方法がわからないが、別の答えが私のために働く。あなたの優しさにはまだ感謝します。 – Andy

+0

はい、Nguyen Sy Thanh Sonの答えは正しいです。 CMDは他の人たちによっても上書きされる – Julian

1

のベストプラクティスには、あなたがDockerfileを作成するときに、あなただけのユーザー1 CMDと1 ENTRYPOINT必要があります。あなたのケースでは

、それは次のようになります。

COPY code/ /usr/local/lib 
WORKDIR /usr/local/lib 

RUN npm install -g [email protected] 
RUN npm install -g sequelize 
RUN npm install -g mysql 
RUN npm install -g typescript 

RUN sh -c rm webApp.js 
RUN sh -c tsc webApp.ts 
CMD ["node", "webApp.js"] 
+0

ありがとう、それは私のために働く。 Dockers外のフォルダにはjsファイルはまだ見えませんが、その理由は、キャッシュが即時にフラッシュされないということです。 – Andy

+0

jsファイルはコンテナ内で生成されるため、作成された新しいコンテナに保存されます。外に持っておきたい場合は、コンテナをボリュームで実行する必要があります。 – Julian

0

素晴らしいスタート!

あなたは私が私のGitHub別の答えが気づいたようDocker/NodeJS/Typescript starter project

でこれを実現する方法をチェックアウトすることができ、あなただけの1つのCMDコマンドを使用し、その代わりにCMDは、あなたがRUN sh -c tsc webApp.tsを使用する必要があることを利用しなければなりません。これは、RUN npm install -g typescriptを使用して以前にコンテナにインストールしたtscコマンドラインツールを使用して、Typescriptをコンパイルします。

これを実行してDockerfileを実行した後、作業フォルダ(Dockerファイルをホストするフォルダ)にwebApp.jsが表示されますが、実際には表示されません。 コンテナに表示されますが、そうではありません。どうしたの?

Dockerfileからこれらのコマンドを実行すると、実際にはマシンの特別な隠された部分にあるコンテナ内でこれらのコマンドを実行しています。あなたのマシンの孤独な部分と、Dockerfileをホストするマシンの部分は、2つの完全に離れた場所です。したがって、生成されたファイル.jsは表示されません。

ありがたいことに、Dockerにはマシンの2つの部分の間にファイルを「マウント」またはミラーリングする方法があります。これは"volume"と呼ばれます。

ボリュームにはStackOverflow answerがあります。ボリューム構文は、dockerファイル内の次のようなものです:ADD . /path/inside/docker/container。コマンドは次のように構成されています:ADD {my_filepath} {container_filepath}。つまり、{my_filepath}のマシン上にあるものは、{container_filepath}というパスのコンテナに「マウント」またはミラーリングされるようになります。

ADD . .は、現在の作業ディレクトリをコンテナのメイン作業ディレクトリにマウントします。

関連する問題