guni.log

日々の進捗・ポエムのごった煮

Docker Registry HTTP API v2でDockerイメージのダウンローダを作った話

久しぶりにtechな記事書きます.
コンテナ作るとき,OSのイメージの用意とかめんどうですよね.
僕はdebootstrapとかpacstrapとか使ってました.
でもroot権限が必要だったり,ダウンロードに時間がかかります.

そこでDocker Registry HTTP API v2を使ってみます.
HTTPでdocker pullみたいなことができるすごいやつ.
しかもOCIで標準化されるコンテナイメージの配布方法にはこれをベースにするらしい.

docs.docker.com

cromwellも内部はこれを採用しています.
今回はこの部分を取り出してCLIツールとして作って公開しました.
ほぼcromwellからの輸入なので開発時間は20分も無いですね.

github.com

今回作ったやつ 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にしか対応していないので,他のレジストリに対応していきたいですね.