次世代のdocker、Docker BuildKit

噂によると、次世代感満載のdockerが使えるようになっているらしい。
その名も、BuildKit
Docker 18.06より実験的に使用可能だったものが,Docker 18.09にて正式に採用されたとか。

Docker Build Meetupで盛んに話されていたようです。以下のまとめが美しいです。必見です。

dev.classmethod.jp

適用方法

DOCKER_BUILDKIT=1という環境変数をexportするだけ。

export DOCKER_BUILDKIT=1

具体的に何が変わったのか。

  • 見た目がカッコいい。
  • RUN --mount=type=cache命令を使用することによるコンパイラやパッケージマネージャのキャッシュ利用。
  • RUN --mount=type=secret命令を使用することによるGitリポジトリや,S3への安全なアクセス(RUN --mount=type=ssh命令により、パスフレーズ入力も可)。
  • リモートDockerホストへのSSH接続(リモートのdockerカーネルをSSH経由で使用)

すんごいですね。
今回は3番目の安全なssh-agent認証の使用についてご紹介します。

プライベートリポジトリからレポジトリをclone②

前回のあらすじ

www.kimoton.com

前回の記事でご紹介したように、これまでもマルチステージビルドによりcredentialな情報を扱うssh-agent認証は可能でした。

が、これは恐らく想定された使い方でなく、いうなれば裏技的なモノだったかと思います。
そもそもマルチステージビルドはイメージサイズの削減のために生まれたものです。

git cloneするときだけ!S3にアクセスするときだけ!マウントできたらいいのに!

Build-time secrets機能

そんな思いを形にしたのがBuild-time secrets機能です。 これを使うとなんと、一時的なマウントによりホストマシンのSSH鍵を使用することができます。もうコピーしなくていいんです。

この機能は今のところ非標準命令であるため、Dockerfileの1行目に
# syntax = docker/dockerfile:experimentalと記述する必要があります。

Dockerfile例
マウントしたファイルを使用したいコマンドの前に
--mount=type=secret,id=ssh,dst=/root/.ssh/id_rsaを付けるだけです。 dstには秘密鍵のコンテナ内での配置先を指定します。

docker buildコマンド例
idはDockerfileとの関連付けに使われます。srcにはホストOSに存在する秘密鍵のファイルパスを指定します。

docker build --secret id=ssh,src=$HOME/.ssh/id_rsa .

実行!!

f:id:kimoppy126:20190115191635p:plain こんな感じにコマンドが青いです。かっちょいいです。

一時的にマウントしただけなので当たり前ですが、
できたコンテナは、docker historyからも鍵が見えず、中間レイヤからも参照することはできません。

$ docker history kimoton/build_time_secrets
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
7a078a439cc0        13 seconds ago      RUN /bin/sh -c git clone git@github.com:nkim…   18.8kB              buildkit.dockerfile.v0
<missing>           18 seconds ago      RUN /bin/sh -c ssh-keyscan -t rsa github.com…   392B                buildkit.dockerfile.v0
<missing>           22 seconds ago      RUN /bin/sh -c touch /root/.ssh/known_hosts …   0B                  buildkit.dockerfile.v0
<missing>           25 seconds ago      RUN /bin/sh -c yum install -y git # buildkit    123MB               buildkit.dockerfile.v0
<missing>           47 seconds ago      RUN /bin/sh -c mkdir /root/.ssh/ # buildkit     0B                  buildkit.dockerfile.v0
<missing>           5 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           5 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           5 weeks ago         /bin/sh -c #(nop) ADD file:6f877549795f4798a…   202MB

結論

BuildKit最高。
リモートDockerホストへのSSH接続もものすごく興味あるので近いうち触ってみます!

参考

Build Enhancements for Docker | Docker Documentation

【docker buildのマニアックすぎる狂宴】Container Build Meetup #1に参加してきた #container_build | DevelopersIO

Docker CE 18.09からssh経由でリモートのdockerデーモンに接続できるようになるってよ - Qiita

Docker v18.09 新機能 (イメージビルド&セキュリティ) – nttlabs – Medium