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
を実行して、自分がいるコンテナの外で、ホストとキャッシュフォルダを共有するにはどうすればよいですか?
私はあなたの質問にコメントする評判がほとんどないので、私の答えにもいくつかの質問があります。
私はあなたと同じセットアップを作成しようとしましたが、(上記の説明に基づいて)縮小されましたが、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がどの程度/頻繁に変更されるかをここで通知できますか。