なぜ COPY package*.json ./ が COPY . . の前に来るのですか? 質問する

なぜ COPY package*.json ./ が COPY . . の前に来るのですか? 質問する

Docker に関するこの Node.js チュートリアルでは、次のことが行われます。https://nodejs.org/ja/docs/guides/nodejs-docker-webapp/ を参照してください。

のポイントは何ですかCOPY package*.json ./?

すべては でコピーされるのではないですかCOPY . .?

問題の Dockerfile:

FROM node:8

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm install --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "npm", "start" ]

ベストアンサー1

これは Dockerfiles (すべての言語) で一般的なパターンです。このnpm installステップは時間がかかりますが、パッケージの依存関係が変更された場合にのみ実行する必要があります。そのため、依存関係をインストールするだけのステップと、実際のアプリケーションを追加する 2 番目のステップが一般的です。これにより、コンテナーの再構築が速くなります。

イメージを一度構築する場合、これは本質的に同一であり、最後に同じファイルシステムの内容が出力されます。

ただし、パッケージの作業中にこれが起こったとします。いくつかのsrc/*.jsファイルを変更しましたが、は変更していませんpackage.json。 を実行するnpm testと問題ないように見えます。次に を再実行しますdocker build。Docker はpackage*.jsonファイルが変更されていないことを認識し、何も再実行せずに最初に構築したのと同じイメージ レイヤーを使用します。そして、npm installステップもスキップします(同じコマンドを同じ入力ファイルシステムで実行すると、同じ出力ファイルシステムが生成されるという前提があるため)。そのため、2番ビルドの実行が速くなります。

おすすめ記事