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


97

Dockerfileには、以下をインストールするレイヤーがありますrequirements.txt

FROM python:2.7
RUN pip install -r requirements.txt

Dockerイメージをビルドすると、このファイルに加えられた変更に関係なく、プロセス全体が実行されます。

pip install -r requirements.txtファイルに変更があった場合にのみDockerが実行されるようにするにはどうすればよいですか?

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

1
docker build(およびあなたのDockerfile)の出力を投稿してください。おそらく、キャッシュを無効にしてこのステップを実行するのは、ビルドプロセスの初期のステップです。
トーマスオロスコ2015

私が現時点で持っているすべてのものでOPを更新します
Prometheus 2015

1
このステップだけでは役に立ちません。完全な出力(または少なくともDockerfile)を投稿してください。
トーマスオロスコ2015

回答:


179

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

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


8
一般的なガイドラインとして、の動作が特に必要でない限り、私はよりCOPYも好ましいとADD思いますADD
メトロポリス

2
@メトロポリス、あなたは完全に正しいです。ヒントをありがとう。
ヘルムバート2017

5
@Metropolisに同意します。フォルダーに、解凍する必要があるアーカイブ、またはリモートURL処理をサポートする必要があるアーカイブが含まれているADD場合にのみ必要です<src>{ソースコード}
Mohsin 2017年

45

これは、Docker自身の「Dockerfilesを作成するためのベストプラクティス」で直接言及されています

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

例えば:

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

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


0

または、「yes」と入力せずにrequirements.txtファイルを実行してライブラリのインストールを確認するより迅速な方法として、次のように書き直すことができます。

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.