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番ビルドの実行が速くなります。