Docker Registry HTTP API v2でDockerイメージのダウンローダを作った話
久しぶりにtechな記事書きます.
コンテナ作るとき,OSのイメージの用意とかめんどうですよね.
僕はdebootstrapとかpacstrapとか使ってました.
でもroot権限が必要だったり,ダウンロードに時間がかかります.
そこでDocker Registry HTTP API v2を使ってみます.
HTTPでdocker pullみたいなことができるすごいやつ.
しかもOCIで標準化されるコンテナイメージの配布方法にはこれをベースにするらしい.
cromwellも内部はこれを採用しています.
今回はこの部分を取り出してCLIツールとして作って公開しました.
ほぼcromwellからの輸入なので開発時間は20分も無いですね.
今回作ったやつ github.com
Rustで開発してるのでcargoですぐにインストール可能です.
$ cargo install oci-fetcher
oci-fetcher + unshare + で非特権コンテナ!
alpineのイメージをとってきて雑に非特権コンテナを作ってみます.
$ oci-fetcher pull -n library/alpine -o alpine-test $ ls alpine-test/ bin cromwell dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
それっぽいディレクトリができてますね. あとはunshareしてchrootするだけで非特権コンテナっぽい何かができました
$ unshare --user --cgroup --mount --ipc --pid --net --uts -r --fork bash [root@archlinux ~]# chroot alpine-test /bin/sh / # id uid=0(root) gid=0(root) groups=65534(nobody),0(root),65534(nobody)
改善点
DockerHubにしか対応していないので,他のレジストリに対応していきたいですね.