web-dev-qa-db-ja.com

ビルドサーバーにキャッシュを使用してDockerイメージをビルドしますか?

Gitからコードをフェッチしてビルドし、Dockerイメージを作成して、いくつかの本番サーバーに出荷するJenkinsCIサーバーがあります。

私たちのプロジェクトは主にPythonで書かれているので、「構築」には実行が含まれます

pip install -r requirements.txt

それはちょっと遅いことを除いて、それはうまくいきます。ネットワーク経由でパッケージをフェッチする必要があり、さらにいくつかのパッケージ用にCライブラリを構築する必要があります(「lxml」は小さくありません!)。

開発では、pip-accelを使用してこのプロセスを高速化することに成功しました。 pipと同じインターフェースを持っていますが、PythonダウンロードとビルドされたCコードの両方をキャッシュするので、

pip-accel install -r requirements.txt

速いです。

プロダクションビルドでこれを実行したいのですが、いくつかの障害に直面しています。

明らかに、pip-accelにはキャッシュを保存するためのディレクトリが必要です。 CIサーバーがビルドを実行するので、それを配置するのが論理的な場所です。ただし、pip installコマンドは新しいDockerコンテナ内で実行されるため、そのサーバー上の共通ディレクトリにアクセスすることはできません。

Dockerの「ボリューム」は、コンテナーとディレクトリを共有するように設計されているように見えますが、ビルドはdocker build内で行われ(驚いたことに)、docker runのみがボリュームをアタッチできます。 docker buildでボリュームをアタッチすることはできません。

足りないものはありますか? docker buildを実行して、自分がいるコンテナの外で、ホストとキャッシュフォルダを共有するにはどうすればよいですか?

7
Tim

私はあなたの質問にコメントする評判がほとんどないので、私の答えにもいくつかの質問があります。

私はあなたと同じセットアップを作成しようとしましたが、(上記の説明に基づいて)縮小されましたが、Docker独自のキャッシュメカニズムで改善されているようです

私の例のDockerfileは次のようになります。

FROM ubuntu:14.04   

RUN apt-get update \
  && apt-get install -y python-pip python-dev build-essential \
  && pip install pip-accel

COPY requirements.txt /requirements.txt

RUN pip-accel install -r /requirements.txt

CMD tail -f /dev/null

そしてrequirements.txtは次のようになりました:

Flask==0.8
Jinja2==2.6
Werkzeug==0.8.3

これを初めて構築した後(もっと長く見てください)、新しいライブラリ「chardet == 1.0.1」を追加しました。これで、requirements.txtは次のようになりました。

Flask==0.8
Jinja2==2.6
Werkzeug==0.8.3
chardet==1.0.1

Dockerビルドを実行した後、古いpipライブラリも含まれているすべてのdocker独自のキャッシュを使用しました

anovil@anovil-Latitude-E6440:~/tmp/serverfault/docker$ time docker build --rm .
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM ubuntu:14.04
 ---> 89d5d8e8bafb
...
...
Removing intermediate container 337c23340e7a
Step 5 : CMD tail -f /dev/null
 ---> Running in 5cb25bc75bbe
 ---> d3dfe184934b
Removing intermediate container 5cb25bc75bbe
Successfully built d3dfe184934b

real    0m6.325s
user    0m0.024s
sys 0m0.012s

なぜなら、dockerbuildはデフォルトで '--force-rm = false'、 '-no-cache = false'を持っているからです。
Jenkins CIがこのビルドを異なるユーザーとして、または異なるホストで実行する場合は、話が異なる可能性があります。それ以外の場合は、Dockerfileでコマンドを並べ替えるだけです。
それでも質問がある場合は、サンプルのDockerfileを共有し、jenkinsビルドごとにrequirements.txtがどの程度/頻繁に変更されるかをここで通知できますか。

1
Maniankara