5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

skaffoldでBuildKitを有効にする

Last updated at Posted at 2019-01-30

Docker 18.09で正式にリリースされたBuildKit。これを有効にしてdocker buildを実行するとこれまでよりセキュアかつ並列化のおかげでビルド時間を短くすることが可能になります。

今回は、skaffoldとBuildKitの簡単な紹介と、そのBuildKitをskaffoldというCLIツールを使用した場合に有効化する方法と速度差を記載します。

skaffold?

Kubernetesを使った開発がしやすくなるGoogle謹製のコマンドラインツール。簡単に説明すると、ソースコードをウォッチして、変更があればビルドしKuberntesクラスターにあげてくれるというところまでを自動でやってくれるツールになります。

より詳しく知りたい場合、こちらの記事が詳しいです。

Kubernetesの開発環境で困っているならskaffoldを使え

BuildKit?

冒頭でも簡単に触れていますが、これまでよりもセキュアかつ高速でのビルドが可能になるdockerのイメージビルダーです。Docker 18.06ではexperimentalでしたが、18.09で正式に導入されました。

Buildkitに関してはこちらの資料が詳しいです。

skaffoldで有効にする

Kubernetesを使った開発で、skaffoldを使っているのであれば、 skaffoldでもBuildKitを有効にしてビルド時間を高速化したくなると思います。CLI上で export DOCKER_BUILDKIT=1と打つだけで通常のdocker buildではBuildKitが有効になるのですが、skaffoldではskaffold.yamlでの設定が必要になります。

設定は簡単で、設定ファイルがすでにあれば一行追加するだけでいけます。

skaffold.yaml
apiVersion: skaffold/v1beta3
kind: Config
build:
  tagPolicy:
    sha256: {}
  artifacts:
  - image: sample-app/app-dev
  local:
    useBuildkit: true ← これ
deploy:
  kubectl:
    manifests:
    - kubernetes/app/*

注意点としては、apiVersion が古いと使えません。僕個人の環境でいうと、半年ちょっと前くらいに入れたskaffoldだとバージョンがv1alpha2となっていて古かったため、使うことができませんでした。

また、apiVersionを上げた場合書き方が多少変わってしまっている箇所もあるため、その場合は少し修正を加える必要が出てきます。

まだ使用したことがない方であれば、最新バージョンを使うことで有効にできるかと思いますのでそのまま最新版をお使いください。

実際に使ってみてどうか

このDockerファイルを使い、有効/無効な場合でどれくらい速度に差が出るか確認してみました。

Dockerfile
FROM node:9.2

COPY . /var/laravel

WORKDIR /var/laravel

RUN npm install \
  && npm rebuild node-sass \
  && npm run production

RUN rm -rf ./node_modules

FROM php:7.2-fpm-alpine

# install libraries
RUN apk upgrade --update \
    && apk add \
       git \
       zlib-dev \
       nginx \
    && docker-php-ext-install pdo_mysql zip \
    && mkdir /run/nginx

# install composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
  && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
  && php -r "unlink('composer-setup.php');"

ENV COMPOSER_ALLOW_SUPERUSER 1

# setting up apps
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY --from=0 /var/laravel /var/www/laravel
WORKDIR /var/www/laravel

# install php libraries && compile laravel mix
RUN composer install --no-dev

RUN find ./vendor -iname tests -type d | xargs rm -rf \
    && find ./vendor -iname tests -type d | xargs rm -rf

COPY ./run.sh /usr/local/bin/run.sh

RUN chown nginx:nginx storage/logs \
    && sed -i 's/www-data/nginx/g' /usr/local/etc/php-fpm.d/www.conf \
    && chown -R nginx:nginx storage/framework \
    && cp .env.example .env \
    && php artisan key:generate \
    && mkdir -p  /usr/share/nginx \
    && ln -s /var/www/public /usr/share/nginx/html \
    && chmod +x /usr/local/bin/run.sh

CMD ["run.sh"]

無効にした状態で実行した場合と有効にした場合とでは2分近くビルド時間に差が出ました。実際に試して出た数字は下記。だいぶ速度に差が出ています。(余談ですが、そもそもこれだけ時間かかっているのは、Multi-stage Buildでnpmやcomposer installをインストールから実行まで行っているのと、最適化を行っていないため)

無効 有効
4m58s 2m37s

さいごに

もし試してみたい、という方がいましたら、Laravel on Kubernetesなサンプルアプリを用意してあるので試してみて貰えればと思います。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?