2016-09-22 3 views
3

私はC++プロジェクトのビルドをドッカーのイメージに移動する作業を進めています。イメージはJenkinsの仕事によって構築され、プッシュされます。ドッカーになる前に、私はジェンキンスのビルドをスピードアップするためにccacheを多用しました。特にビルドの場合はほとんど変更がありませんでした。ドッカーの問題は、ビルドが分離された環境で実行されるため、もはやccacheのメリットがないことです。一時的なコンテナの内部にccacheを利用しながらビルドする方法はありますか?ドッカーの内部にビルドするときのccacheの使用

答えて

4

引き続き、ccacheをビルドと組み合わせて使用​​できます。

データは、次のコマンドを使用してビルド/コンパイル間で保持できるようにするためにData Volumeを作成します。

$ docker create -v /mnt/ccache:/ccache --name ccache debian 

は、その後、あなたのコンテナを作成する「マウント」--volumes-fromコマンドラインオプションを使用して、上記で作成したデータコンテナ。

$ docker run -e CCACHE_DIR=/ccache --volumes-from ccache -it debian 

今、あなたは、Debianのコンテナの殻になるだろうし、必要なアプリケーションやテストccacheをインストールすることができます。

[email protected]:/# apt-get update && apt-get install -y gcc ccache  

は今、この時点で、あなたはキャッシュをチェックすることができ、それは次のようになります

[email protected]:/# ccache -s 
cache directory      /ccache 
cache hit (direct)      0 
cache hit (preprocessed)    0 
cache miss        0 
files in cache       0 
cache size        0 Kbytes 
max cache size      1.0 Gbytes 

データボリュームは維持されるため、コンテナが終了してもキャッシュはそのまま残ります。ボリュームをマウントする(および-e ENV変数を指定する)将来のビルドでは、キャッシュが利用されます。

は次に、簡単なアプリを作成し、それを実行し、再度キャッシュをチェック:

[email protected]:/# cat > foo.c << __EOF__ 
int main(int argc, char **argv) 
{ 
    return 0; 
} 
__EOF__ 

[email protected]:/# PATH=/usr/lib/ccache:$PATH gcc -o foo.o -c foo.c 
[email protected]:/# ccache -s 
cache directory      /ccache 
cache hit (direct)      1 
cache hit (preprocessed)    0 
cache miss        1 
files in cache       2 
cache size        8 Kbytes 
max cache size      1.0 Gbytes 

あなたはキャッシュが今移入され見ることができ、さらにそれのためにパフォーマンスが向上します構築します。

データ量は維持されるため、コンテナが終了した後もキャッシュはまだ存在します。ボリュームをマウントする(そして-e ENV変数を指定する)将来のビルドでは、キャッシュが利用されます。

Using Ccache with Docker

+0

トラブルがある(と私はちょうど誤解される可能性があります)、私は私のビルドの結果としてイメージを作成したいのです:

このブログの記事は、それを説明するのは良い仕事をしていません。この方法では、コンテナ内でccacheを使用できますが、ドッキング・ビルド・コマンドでは使用できません。 –

+1

'ROCK'コマンドを使ってDockerfileに' ccache'を追加するか、Docker Composeを使って 'docker-compose build'の間にボリュームをマウント&使用することができます。 'docker commit'を使ってコンテナを画像に保存することもできます。 –

+0

ええ、私は上記の「ドッカーコミット」を組み合わせるのがおそらく最善のルートだと思います。ありがとうございました。 –

関連する問題