さて、Dockerファイルを書くときの効率に関するこの素晴らしい記事を見つけました。
これは、RUN npm install
命令を実行する前にアプリケーションコードを追加する不正なDockerファイルの例です。
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 npminstallはトリガーされません。命令では、package.jsonの変更のみがトリガーされます。より良い練習用Dockerファイル:
FROM ubuntu
MAINTAINER David Weinstein <david@bitjudo.com>
# 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 ^をアプリがコンテナー内にある場所に変更します。
ADD
を支持することはお勧めしませんCOPY
。COPY
さらに効果的です。IMO、最後の2つの段落は重複しているため、必要ありません。また、アプリの観点からWORKDIR
は、設定されている限り、ファイルシステムのどこにアプリが存在するかは問題ではありません。