2016-03-30 5 views
1

私は、javascriptファイルを持つpythonでアプリケーションを構築しています。私はbrowserifyを使用したいので、私はrequire呼び出しで私のjsファイルで使用できるいくつかのノードモジュールをインストールしたいと思います。私はこれらのノードモジュールをホストマシンではなく私のコンテナに入れたい。ここでは、ノード固有のコンテナのDocker設定です。ホストボリューム共有で上書きされるドッカーコンテナファイル

### Dockerfile 
FROM node:5.9.1 
RUN npm install -g browserify 
RUN mkdir /js_scripts 
ADD package.json /js_scripts/                           
WORKDIR /js_scripts 
RUN npm install # This installs required packages from package.json 
RUN ls # lists the node_modules directory indicating successful install. 

は今、私はコンテナにbrowserify main.js -o bundle.jsコマンドを実行できるように、このコンテナと私のホストマシンからjs filesを共有したいです。ここにdocker-compose.ymlがあり、host_js_filesを私のjs_scriptsディレクトリにコピーします。

node: 
    build: .                                
    volumes: 
    - ./host_js_files:/js_scripts 

私はjs_scriptsディレクトリにコンテナdocker-compose run node bashlsを実行すると、私は唯一のホスト・ボリュームからの私のjsファイルを参照してください、そして私のnode_modulesディレクトリが表示されていません。これは、ドッカーでボリュームがどのように設定されているかに基づいて意味があります。

しかし、これらのノードモジュールを検索するbrowserifyを正常に実行するには、これらをnode_modulesに入れておきたいと思います。コンテナにノードモジュールをグローバルにインストールしたり、ホストマシンにモジュールをインストールしたりせずにこれを行う良い方法はありますか?

ありがとうございます。

+0

私はまったく同じ問題を抱えています。あなたは偶然、実用的な解決策を見つけましたか? – Spock

+0

「新しいコンテナを作成するたびにすべての依存関係をダウンロードしないようにnode_modulesディレクトリにボリュームをマウントできます」と表示された正しい答えに基づいて、 'node_modules'ディレクトリをホストマシンから共有する必要がありました。この方法では、コンテナーが初めて始動したときに、ノード・モジュールを共用ボリュームにダウンロードし、コンテナが始動するたびにアクセス可能でした。 – akotian

答えて

1

コンテナはステートレスでなければなりません。コンテナを破壊すると、その中のすべてのデータが破壊されます。ボリュームとしてnode_modulesディレクトリをマウントして、新しいコンテナを作成するたびにすべての依存関係をダウンロードしないようにすることができます。 一度browserifyをインストールし、この例を参照してください:

### docker-compose.yml 
node: 
    image: node:5.9.1 
    working_dir: /js_scripts 
    command: npm install browserify 
    volumes: 
    - $PWD/host_js_files:/js_scripts 

まず、あなたはdocker-compose upを実行して、すべてのパッケージがインストールされるまで待つ必要があります。その後、browserifyコマンドを次のように実行してください:

docker-compose run node /js_scripts/node_modules/.bin/browserify /js_scripts/main.js -o /js_scripts/bundle.js 
1

ホストファイルをフォルダ共有によってドッカーコンテナファイルと混在させることは悪い考えです。コンテナを削除した後、ドッカーはすべてのコンテナデータを削除します。 Dockerは、どのファイルがコンテナに属しているか、どのファイルがホストされているかを知る必要があります(Dockerはボリューム以外のすべての内部コンテナを削除します)。

  1. コンテナの起動後にコンテナファイルをボリュームに入れます。 (悪い考え、コンテナファイルは、コンテナの除去後に削除されません)
  2. あなたは/js_scriptsにサブフォルダまたは別々にすべてのスクリプトを宣言するために、あなたのホストのスクリプトを置くことができます。

    -v ./host_js_files/script1.jsを: /js_script/script1.js -v ./host_js_files/script2.js:/js_script/script2.js

関連する問題