web-dev-qa-db-ja.com

Dockerは、変更があった場合にのみpip requirements.txtを実行する方法は?

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))
53
Prometheus

ビルドプロセスのある時点で、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...

要件ファイル自体はおそらくほとんど変更されないため、アプリケーションコードを画像に追加するまで、キャッシュされたレイヤーを使用できます。

109
helmbert

これはDocker自身の「 Dockerfilesを作成するためのベストプラクティス 」に直接記載されています。

コンテキストとは異なるファイルを使用する複数のDockerfileステップがある場合、それらを一度にすべてではなく個別にコピーします。これにより、特に必要なファイルが変更された場合にのみ、各ステップのビルドキャッシュが無効になります(ステップを強制的に再実行します)。

例えば:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

COPYを配置した場合よりも、RUNステップのキャッシュ無効化が少なくなります。/tmp /の前。

27
jrc