コンテナとホストのために別々のNodeThangモジュールでDockerizedノードアプリケーションを作成する方法


DockerとノードがあるGotchaがありますnode_modules ホスト上のディレクトリはnode_modules コンテナ内.これは通常、dev環境で起こります.そこでは、コンテナがホストからのファイルへの更新を受け取るようになります.
次のように動作します.
  • あなたはDockerコンテナとして実行したいノードベースのプロジェクトを持っています
  • あなたDockerfile ランnpm install 画像の作成
  • The node_modules ディレクトリのようなもの/app すべてのノードパッケージであなたのpackage.json 参考文献
  • あなたのDocker画像の残りの部分は
  • あなたはDockerにコンテナとしてイメージを走らせるよう頼みます/app コンテナのディレクトリをホスト上のプロジェクトのディレクトリに格納します.
  • があるならばnode_modules ホスト上のプロジェクトのディレクトリは、/app/node_modules コンテナのディレクトリ.
  • このGotchaの症状は奇妙な依存バージョンの不一致、パッケージを欠落、などのような感嘆符が含まれています
    あなたが何かを非難するならば、プロジェクトと同じディレクトリでアプリケーション依存関係を保つために、ノードを非難してください.これには利点がありますが、欠点もあります.
    これを修正する方法は、あなたのDockerイメージを持っていることですnode_modules 別のディレクトリ.これは言うより易しいあなたのホストが持っている限りnode_modules に変換されるディレクトリ/app/node_modules , ノードは常にそれが近接しているので、それを好むでしょう.
    私がこの好みのために説明した方法は/app/node_modules 人が何であるかにかかわらず、空であるnode_modules ディレクトリが含まれます.

    フィックス
    私のような場合は、上記のすべての説明をスキップし、この見出しにスクロールします.さらにADOなしでは、この問題を修正することができます.
    私の修正のために必要なツールnpm , など)
  • yarn
  • ドッカー構成
  • 仮定
  • あなたのアプリケーションコードを保持する/app インザコンテナ
  • あなたdocker-compose.yml , Dockerfile , and package.json あなたのアプリを実行するために必要なすべての他のものをホールド
  • 必要に応じてノードDockerベースイメージを使用します私は、ちょうど現在の好みを例として含みます.
  • あなたDockerfile 自分勝手だCMD or ENTRYPOINT , など

  • ドッカー作曲
    version: "3.8"
    services:
      web:
        container_name: my-service
        hostname: my-service
        build:
          context: .  # The Dockerfile is in the current directory
        volumes:
          - .:/app
          - /app/node_modules  # Ensure `/app/node_modules` is always empty in the container
    
    最終行- /app/node_modules ... ) が最も重要です.それは/app/node_modules はコンテナ内で常に空です.

    Dockerfile
    FROM node:15.3-alpine3.12
    WORKDIR /  # Important for installing node packages
    COPY package.json package.json
    # Install Node dependencies at `/node_modules` in the container.
    RUN set -x \
        && yarn install --modules-folder=/node_modules
    ENV PATH=/node_modules/.bin:$PATH
    WORKDIR /app
    CMD ["/app/scripts/run.sh"]
    

    包む
    今あなたのコンテナが起動すると、あなたのアプリケーションが使用されます/node_modules 依存性を見つけるには
    また、実行することができますyarn install あなたが何をしてもnode_modules コンテナの環境を汚染することを気にせずにホストに.The /app/node_modules コンテナのディレクトリは空のままです.
    私は、次でテストしました.JSプロジェクトとそれは偉大に働いた.それはあなたのために働く願っています.ハッピープログラミング!