[解決済み] Dockerfile をビルドする際に RUN npm install 命令をキャッシュする方法
質問
現在、自分のアプリケーションのために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^をコンテナ内のアプリの場所に変更するだけです。
関連
-
[解決済み】MongoDBでコレクションを日付で並べ替えるには?
-
[解決済み] DynamoDBで一括削除するにはどうしたらいいですか?
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerでイメージのクリーンビルドを強制する方法
-
[解決済み] NPMパッケージの以前の正確なバージョンをインストールするにはどうすればよいですか?
-
[解決済み] Node.jsのNPMモジュール(package.json)のdevDependenciesのインストールを防ぐにはどうすればよいですか?
-
[解決済み] 複数のnpmスクリプトを並列に実行するにはどうしたらいいですか?
-
[解決済み] npm install vs. update - 違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】エラー TRK0005: 位置特定に失敗しました。"CL.exe"
-
[解決済み] 非推奨パッケージに関するNPM警告メッセージ
-
[解決済み】Node.jsのホスト名/IPが証明書のaltnamesと一致しない。
-
[解決済み】MongooseでEnumを作成し使用する方法
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] TypeErrorです。リクエストパスにエスケープされていない文字が含まれています。