1. ホーム
  2. node.js

[解決済み] Dockerfile をビルドする際に RUN npm install 命令をキャッシュする方法

2022-05-16 03:11:58

質問

現在、自分のアプリケーションのためにNodeのバックエンドを開発しています。 それをドッキングする際に ( docker build . ) をドッキングする際、最も長いフェーズは RUN npm install . は RUN npm install 命令は小さなサーバー コードの変更ごとに実行されるため、ビルド時間が長くなり生産性が損なわれます。

アプリケーションコードがある場所で npm install を実行し、ADD 命令でコンテナに node_module を追加することでこの問題を解決できることがわかりましたが、ベストプラクティスからはほど遠いものです。これは、Dockerizing の全体的なアイデアを壊すようなもので、コンテナの重量をはるかに増加させる原因となります。

他の解決策はありますか?

どのように解決するのですか?

わかりましたので、私は見つけた この素晴らしい記事 を見つけました。

を実行する前にアプリケーションコードを追加している、悪いドッカーファイルの例です。 RUN npm install 命令を実行する前にアプリケーションコードを追加しています。

FROM ubuntu

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs

WORKDIR /opt/app

COPY . /opt/app
RUN npm install
EXPOSE 3001

CMD ["node", "server.js"]

アプリケーションのコピーを2つのCOPY命令(1つはpackage.jsonファイル、もう1つは残りのファイル)に分割し、実際のコードを追加する前にnpm install命令を実行することにより、どんなコードの変更でもRUN npm install命令が起動されず、package.jsonの変更のみが起動されることになります。より良い練習のためのドッカーファイルです。

FROM ubuntu
MAINTAINER David Weinstein <[email protected]>

# install our dependencies and nodejs
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs

# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/

# From here we load our application's code in, therefore the previous docker
# "layer" thats been cached will be used if possible
WORKDIR /opt/app
COPY . /opt/app

EXPOSE 3000

CMD ["node", "server.js"]

ここに package.json ファイルを追加し、その依存関係をインストールし、アプリが存在するコンテナの WORKDIR にコピーします。

ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/

すべてのDockerビルドでnpmインストールフェーズを回避するには、これらの行をコピーして、^/opt/app^をコンテナ内のアプリの場所に変更するだけです。