以下のサービスを備えたアプリがあります:
web/
- ポート 5000 で Python 3 Flask Web サーバーを保持して実行します。sqlite3 を使用します。worker/
-index.js
キューのワーカーであるファイルがあります。Web サーバーはポート経由で json API を使用してこのキューと対話します9730
。ワーカーはストレージに redis を使用します。ワーカーはフォルダーにローカルにデータを保存します。worker/images/
さて、この質問は にのみ関係しますworker
。
worker/Dockerfile
FROM node:0.12
WORKDIR /worker
COPY package.json /worker/
RUN npm install
COPY . /worker/
docker-compose.yml
redis:
image: redis
worker:
build: ./worker
command: npm start
ports:
- "9730:9730"
volumes:
- worker/:/worker/
links:
- redis
を実行すると、すべてが期待どおりに動作し、すべての npm モジュールが期待どおりに にdocker-compose build
インストールされます。/worker/node_modules
npm WARN package.json [email protected] No README data
> [email protected] install /worker/node_modules/pageres/node_modules/screenshot-stream/node_modules/phantom-bridge/node_modules/phantomjs
> node install.js
<snip>
しかし、そうするとdocker-compose up
、次のエラーが表示されます:
worker_1 | Error: Cannot find module 'async'
worker_1 | at Function.Module._resolveFilename (module.js:336:15)
worker_1 | at Function.Module._load (module.js:278:25)
worker_1 | at Module.require (module.js:365:17)
worker_1 | at require (module.js:384:17)
worker_1 | at Object.<anonymous> (/worker/index.js:1:75)
worker_1 | at Module._compile (module.js:460:26)
worker_1 | at Object.Module._extensions..js (module.js:478:10)
worker_1 | at Module.load (module.js:355:32)
worker_1 | at Function.Module._load (module.js:310:12)
worker_1 | at Function.Module.runMain (module.js:501:10)
結局、どのモジュールも/worker/node_modules
(ホスト上またはコンテナ内に)存在しないことが判明しました。
ホスト上では、npm install
すべて正常に動作します。しかし、私はそれをしたくありません。コンテナーで依存関係を処理したいと考えています。
ここで何が問題になっているのでしょうか?
(言うまでもなく、すべてのパッケージは に入っていますpackage.json
。)
ベストアンサー1
これは、ビルド中にボリュームがマウントされず、worker
ディレクトリをボリュームとして に追加したために発生します。docker-compose.yml
docker がイメージをビルドすると、ディレクトリnode_modules
内に ディレクトリが作成されworker
、すべての依存関係がそこにインストールされます。次に、実行時に、worker
docker 外部の ディレクトリが docker インスタンス ( がインストールされていないnode_modules
) にマウントされ、node_modules
インストールした が非表示になります。マウントされたボリュームを から削除することで、これを確認できますdocker-compose.yml
。
回避策としては、ディレクトリがマウントされるnode_modules
前に、データ ボリュームがビルドされた Docker イメージからデータをコピーするため、データ ボリュームを使用してすべての を保存しますworker
。これは、次のようにして実行できますdocker-compose.yml
。
redis:
image: redis
worker:
build: ./worker
command: npm start
ports:
- "9730:9730"
volumes:
- ./worker/:/worker/
- /worker/node_modules
links:
- redis
これがイメージの移植性に何らかの問題を引き起こすかどうかは完全にはわかりませんが、ランタイム環境を提供するために主に docker を使用しているようなので、これは問題にならないはずです。
ボリュームについてさらに詳しく知りたい場合は、ここにある優れたユーザー ガイドをご覧ください。https://docs.docker.com/userguide/dockervolumes/
./
編集: Docker はその後、 docker-compose.yml ファイルに相対的なファイル内のマウントに先頭を必要とするように構文を変更しました。