噂によると、次世代感満載のdockerが使えるようになっているらしい。
その名も、BuildKit。
Docker 18.06より実験的に使用可能だったものが,Docker 18.09にて正式に採用されたとか。
Docker Build Meetupで盛んに話されていたようです。以下のまとめが美しいです。必見です。
適用方法
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②
前回のあらすじ
前回の記事でご紹介したように、これまでもマルチステージビルドにより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 .
実行!!
こんな感じにコマンドが青いです。かっちょいいです。
一時的にマウントしただけなので当たり前ですが、
できたコンテナは、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