skopeoでコンテナイメージを操作する

skopeo
Nishipy
宗教上の理由で、skopeoを使い始めました。

はじめに

お久ぶりです。あいかわらず、5月病に罹患中のnishipyです。GW気分から抜ける気配がありません。

さて今回は、転職して以降、宗教上の理由から使うことが増えたskopeoというコマンドラインツールについて紹介し、自分のためにもメモを残します。

skopeo

skopeoは、コンテナイメージやコンテナイメージレジストリに対して、様々な操作を行うためのコマンドラインツールです。OSSとして開発されています。

GitHub - containers/skopeo: Work with remote images registries - retrieving information, images, signing content
Work with remote images registries - retrieving information, images, signing content - containers/skopeo

skopeoができること

↑のREADMEをみると、skopeoは以下のようなことができるようです。

Skopeo works with API V2 container image registries such as docker.io and quay.io registries, private registries, local directories and local OCI-layout directories. Skopeo can perform operations which consist of:
・ Copying an image from and to various storage mechanisms. For example you can copy images from one registry to another, without requiring privilege.
・ Inspecting a remote image showing its properties including its layers, without requiring you to pull the image to the host.
・ Deleting an image from an image repository.
・ When required by the repository, skopeo can pass the appropriate credentials and certificates for authentication.

つまり、Docker HubやRed Hat Quayのようなリモートレジストリやプライベートレジストリ、ローカルディレクトリなどのコンテナイメージレジストリについて、以下のようなオペレーションができます。

  • コンテナレジストリ同士や、ローカルディレクトリとコンテナレジストリの間で、コンテナイメージをやり取りする
  • リモートレジストリにあるコンテナイメージの情報を、pullすることなく参照できる
  • あるレジストリ上から、コンテナイメージを削除する
  • 必要に応じて、レジストリに対する認証のために、適切な認証情報や証明書を送る

なるほど、さまざまな場所にあるコンテナイメージを操作できるとわかりました。コンテナアプリケーションの開発時など、イメージのレジストリ間移動が簡単にできるなら、便利そうです。

なぜdocker pull/pushでなく、skopeoなのか

異なるレジストリ上のコンテナイメージの操作ができるらしいことがわかったのですが、それってdocker pullとかdocker pushでできるやんけ。そう思いつつ、READMEをもう少しよく読むと、冒頭にこんなことが書いてあります。

skopeo does not require the user to be running as root to do most of its operations.
skopeo does not require a daemon to be running to perform its operations.
skopeo can work with OCI images as well as the original Docker v2 images.

  • skopeoは、ほとんどのオペレーションにルート権限を必要としない
  • skopeoは、オペレーションを行うために、デーモンを必要としない
  • skopeoは、オリジナルのDockerv2イメージと同様に、OCIイメージでも動作する

これは、重要そうな記述です。特に2つ目について、docker pullとかdocker pushを実行する際は、docker daemonが起動している必要があります。もし起動していないと…

その他の特長は、多分あるんでしょうが、今のぼくにはわかりません。



使ってみる

READMEに書いてある項目を一通り試してみます。手元にあるMacbookで実行します。Docker Desktopは、落としておきます。当然dockerコマンドは、動きません。

インストール

Macの場合は、Homebrewでインストールできます。

skopeo/install.md at main · containers/skopeo
Work with remote images registries - retrieving information, images, signing content - containers/skopeo

コンテナイメージを参照する

skopeo inspectで、リモートレジストリ上のコンテナイメージを調べてみます。リモートレジストリのイメージを指定する際は、docker://<image-name>のように指定します。必要に応じて、--credsオプションで、レジストリへの認証情報をセットする必要があります。

対象となるイメージは、下記の記事において、gitlab-ciでビルドし、gitlab.com上のコンテナレジストリにpushしたものです。

GitLab CIで、Ansible+Jupyter入りDocker imageのビルドとテストをする
NishipyAnsible の入ったDockerイメージを作るのに、Jupyter Notebookも入れてみた時のメモです。GitLab信者なので、ついでに簡単なCIパイプラインも添えました。はじめにGitLabGi...(続く)

したがって、skopeoコマンドを打っているマシンにpullしていませんが、ちゃんとコンテナイメージの情報が表示されます。



コンテナイメージをコピーする

次は、コンテナイメージを別のコンテナレジストリにコピーしてみます。先ほど扱ったGitLab上のイメージを、Quayへコピーします。必要に応じて、--src-credsオプションや--dest-credsオプションで、コピー元とコピー先レジストリへの認証情報をセットする必要があります。

ちゃんとコピーできています。

コンテナイメージをダウンロードする

Quayにコピーしたコンテナイメージを、ローカルディレクトリにダウンロードしてみます。ダウンロードするディレクトリは、dir:で指定できます。

よくわからない名前のファイルがダウンロードされました。manifest.jsonを覗いてみると、コンテナイメージのlayerごとに圧縮したファイルのようですね。

コンテナイメージを削除する

最後に、Quayにコピーしたコンテナイメージを削除しておきます。

これで、一通りのオペレーションは試せました。他にも、skopeo manifest-digestskopeo sysncなどのコマンドがありますが、一旦省略します。気になる方は、以下のリファレンスを参照ください。

Package skopeo - man pages | ManKier
Inspect container images and repositories on registries

さいごに

skopeoが対応する、コンテナイメージの操作を一通りやってみました。個人的には、skopeoを使う機会は今後どんどん増えていきそうで、もっと慣れていきたいと思います。宗教上の理由がない皆さんも、試してみてはいかがでしょうか。

以上.

コメント