4

単純なnode.jsプロジェクトの開発環境を作成するためにDockerを使いたいと思っています。ドッカーのコンテナ内にプロジェクトの依存関係(すべてnpmパッケージ)をインストールしたいので、ボリュームを使って自分のコードをマウントしてください。したがって、コンテナは は、私がボリュームをマウントするパスにnode_modulesフォルダを見つけることができますが、私はそれをホストから見るべきではありません。nock依存関係をdockerにインストールしてボリュームからテストする

これは私のDockerfileです:

docker build --tag my-dev-env . 

docker run --rm --interactive --tty --volume $(pwd):/code my-dev-env npm test 

そして、これは私のpackage.jsonです:

FROM node:6 


RUN mkdir /code 
COPY package.json /code/package.json 
WORKDIR /code 

RUN npm install 

これは私がそれを実行する方法です

{ 
    "private": true, 
    "name": "my-project", 
    "version": "0.0.0", 
    "description": "My project", 
    "scripts": { 
     "test": "jasmine" 
    }, 
    "devDependencies": { 
     "jasmine": "2.4" 
    }, 
    "license": "MIT" 
    } 

ことができるので、それが失敗しましたjasmineが見つかりませんので、実際にインストールしていません。

> jasmine 

sh: 1: jasmine: not found 

私はDockerで何を達成したいのですか?代わりに、パッケージをグローバルにインストールすることもできます。私もnpm install -gを試してみました。

私はDockerバージョン1.12.1でビルド23cf638を使用しています。

答えて

2

解決策は、/code/node_modulesをボリュームとして宣言することです。ホストの任意のディレクトリにバインドマウントしないでください。このように:@JesusRTによって示されるように

docker run --rm --interactive --tty --volume /code/node_modules --volume $(pwd):/code my-dev-env npm test 

npm installはうまく働いていたが、バインド・マウントを単体/codeから$(pwd)は、画像内に/codeの既存の内容をシャドウました。上記のように、データボリューム(この場合は/code/node_modules)として宣言することで、コンテナ内の/codeから必要なものを回復できます。

非常に類似した問題は既にDocker-compose: node_modules not present in a volume after npm install succeedsで議論されています。

+0

あなたのdockerの実行コマンドをyamlファイルに入れて、docker-composeを使って起動すると便利です...特にボリュームが多数あり、 –

1

ここで問題は、/codeフォルダを上書きすることです。

ビルド時にnpm installコマンドを実行しているので、作成されるイメージに/codeフォルダにnode_modulesフォルダが含まれていることに注意してください。問題は、docker runコマンドを実行するときに/codeフォルダにボリュームをマウントしているため、このフォルダがローカルマシンの内容で上書きされることです。

一つのアプローチは、npm testコマンドの前にnpm installを実行することができます

docker run --rm --interactive --tty my-dev-env npm install && npm test 

また、正常に動作jasmineコマンドの実行するために、あなたは以下に従うようごpackage.jsonを変更する必要があります。

"scripts": { 
     "test": "./node_modules/.bin/jasmine" 
    } 
+0

これを修正するには、srcを1レベル下に移動してマウントするか(-v 'pwd'/src:/ code/src)、イメージからのデータで初期化される余分なボリュームを保持するために必要なフォルダを入れます-v/code/node_modules) –

+0

@JesusRTあなたが言及したアプローチは、私が記述したように、私が望むものではありません。また、npmは指定されたコマンドを実行する直前にnpm testを実行するシェルの./node_modules/.binをソースしているので、 'package.json'の変更は必要ありません。しかし、あなたの診断は大丈夫です。私は答えを見つけましたので、私はそれを掲示しています。私はまだあなたをアップアップすることはできません申し訳ありません:/、そしてありがとう! –

関連する問題