Dockerfileには、requirements.txt
をインストールするレイヤーがあります:
FROM python:2.7
RUN pip install -r requirements.txt
Dockerイメージを作成すると、このファイルに加えられた変更のプロセス全体に関係なくが実行されます。
ファイルに変更があった場合、Dockerがpip install -r requirements.txt
のみを実行するようにするにはどうすればよいですか?
Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/Django-rest-framework/archive/master.Zip (from -r requirements.txt (line 30))
Downloading https://github.com/tomchristie/Django-rest-framework/archive/master.Zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))
ビルドプロセスのある時点で、COPY
またはADD
を使用して、アプリケーション全体をDockerイメージにコピーしていると想定しています。
COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt
問題は、アプリケーション全体をイメージにコピーするたびにDockerビルドキャッシュを無効にしていることです。これにより、以降のすべてのビルドステップのキャッシュも無効になります。
これを防ぐために、アプリケーション全体をイメージに追加する前に、個別のビルドステップでrequirements.txt
のみファイルをコピーすることをお勧めします。
COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...
要件ファイル自体はおそらくほとんど変更されないため、アプリケーションコードを画像に追加するまで、キャッシュされたレイヤーを使用できます。
これはDocker自身の「 Dockerfilesを作成するためのベストプラクティス 」に直接記載されています。
コンテキストとは異なるファイルを使用する複数のDockerfileステップがある場合、それらを一度にすべてではなく個別にコピーします。これにより、特に必要なファイルが変更された場合にのみ、各ステップのビルドキャッシュが無効になります(ステップを強制的に再実行します)。
例えば:
COPY requirements.txt /tmp/ RUN pip install --requirement /tmp/requirements.txt COPY . /tmp/
COPYを配置した場合よりも、RUNステップのキャッシュ無効化が少なくなります。/tmp /の前。