Docker-compose: npm インストールが成功した後、ボリュームに node_modules が存在しない 質問する

Docker-compose: npm インストールが成功した後、ボリュームに node_modules が存在しない 質問する

以下のサービスを備えたアプリがあります:

  • 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、すべての依存関係がそこにインストールされます。次に、実行時に、workerdocker 外部の ディレクトリが 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 ファイルに相対的なファイル内のマウントに先頭を必要とするように構文を変更しました。

おすすめ記事