キャッシュを使用したドッカーでのQtのコンパイル

これは、Screenly.io のCEOであるViktor Peterssonからのゲスト投稿です。 スクリーンリー ラズベリーパイで最も人気のあるデジタルサイネージ製品です。 ツイッター@vpeterssonでヴィクトルを探す。

前回の ブログ記事では、Dockerの気の利いたマルチステージおよびマルチプラットフォーム機能を使用して、 Screenly OSE 用にQtをコンパイルする方法について説明しました。 この記事では、このトピックをさらに発展させ、キャッシュを拡大します。 

Dockerは、レイヤーを使用したキャッシュで素晴らしい仕事をします。 各コマンド(RUN、ADDなど)はレイヤーを生成し、何かが変更されない限り、Dockerは将来のビルドで再利用します。 いつものように、このプロセスには例外がありますが、これは一般的に真実です。 別の種類のキャッシュは、ソース コードのコンパイルなど、コンテナー 内の 特定の操作のキャッシュです。

Screenlyでは、Dockerコンテナ内にQtビルド環境を作成しました。 このQtビルドは、ビルドプロセスが再現可能で、開発者間で簡単に共有できるようにするために作成されました。 Qtのコンパイルプロセスには長い時間がかかるため、 ccache を活用してQtのコンパイルを高速化しました。 ccacheを実装するには、Docker環境の外部からフォルダーをボリュームマウントする必要があります。 

上記の手順は、プロジェクトに取り組んでいる唯一の開発者である場合に適しています。 チーム全体で共有キャッシュを使用できるようにする場合はどうなりますか?

Docker でこのスタイルのキャッシュを実現する方法はいくつかあります。 

共有キャッシュを確立する最も簡単な方法は、 前の記事で行ったことに従うことです。 BuildKitでのキャッシュを高速化するために、ディスクキャッシュといくつかの 優れた機能 を使用しました。 次に、キャッシュされたファイルを圧縮してチームメンバーに配布しました。 プロセスはあまりエレガントではありませんが、それは仕事を成し遂げます。 

プロセスをもう少し自動化する場合は、ビルドプロセスの一部としてキャッシュの取得を含めることができます。 この例は次のようになります。

RUN curl -o /tmp/build-cache.tgz https://some-domain.com/build-cache.tgz && \
	tar xfz /tmp/build-cache.tgz -C /tmp && \
	rm /tmp/build-cache.tgz

上記のこのプロセスはきちんとしていますが、キャッシュファイルを最新の状態に保つために、誰かがビルドキャッシュを定期的にアップロードする必要があることを意味します。 さらに、ファイルを保存する場所(S3など)が必要です。

手動タスクを回避し、ネイティブのDockerテクノロジーを使用して同じことを実行できればいいのにと思いますよね? 結局のところ、Dockerを使用してプロセスを改善できます。 私たちは想像力を使う必要があります。 

前回の記事で示したように、マルチステージビルドを使用して、異なるDockerイメージ間でデータをコピーできます。 キャッシュを専用のDockerイメージに移動するとどうなりますか? その後、このイメージを Docker Hub にプッシュし、ビルド プロセスにプルできます。 

プロセスは簡単です。 まず、Docker Hub で 2 つの異なるイメージを作成します。 それらを screenly/build-cache 呼び出し、 screenly/build-env. 前回の記事に基づいて、この Dockerfile を の基礎として screenly/build-env使用します。

Dockerfile では、環境変数 CCACHE_DIR /src/ccacheを に設定します。この手順では、キャッシュが に存在することを ccache に /src/ccache通知します。 前回の投稿では、手順はシステムへのボリュームマウントだけでした。 ただし、この場合、キャッシュが の /src /usr/ccache外部に存在するように、この手順を変更します。

これで、次のようにコンテナを起動できます。

$ docker run --rm -t \
    -v ~/tmp/qt-src:/src \
    -v ~/tmp/qt-build:/build \
    -v ~/tmp/ccache:/usr/ccache \
    screenly-build-env

コンパイルが完了したら、キャッシュイメージをビルドしてプッシュできます。 最終的な Dockerfile は次のようになります。

FROM scratch
COPY ccache /ccache

このイメージをビルドするには、次のコードを使用します。

$ cd ~/tmp
$ docker build \
-f /path/to/Dockerfile \
-t screenly/build-cache
$ docker push screenly/build-cache

最後に、このレイヤーを の screenly/build-envDockerfile に含めることができます。 次の行を追加します。

COPY --from=screenly/build-cache /ccache /usr/ccache

次回再構築すると screenly/build-env、Dockerは自動的にキャッシュをプルダウンします。 また、ボリュームマウントを追加する必要があるのは、キャッシュを更新するときだけです。 

スクリーンリーについて

スクリーンリー ラズベリーパイで最も人気のあるデジタルサイネージ製品です。 物理画面を(UIまたは デジタルサイネージAPIを介して)安全なリモート管理デバイスに変えたい場合は、Screenlyを使用するとセットアップが簡単になります。 ユーザーは、美しいダッシュボード、画像、ビデオ、およびWebページのコンテンツを表示できます。

Screenlyには、 オープンソースバージョン 商用バージョンの2つのフレーバーがあります。 14日間の無料トライアルで商用バージョンを試すことができます。