skopeo
を使い始めました。
はじめに
お久ぶりです。あいかわらず、5月病に罹患中のnishipyです。GW気分から抜ける気配がありません。
さて今回は、転職して以降、宗教上の理由から使うことが増えたskopeo
というコマンドラインツールについて紹介し、自分のためにもメモを残します。
skopeo
skopeo
は、コンテナイメージやコンテナイメージレジストリに対して、様々な操作を行うためのコマンドラインツールです。OSSとして開発されています。
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が起動している必要があります。もし起動していないと…
1 2 3 |
$ docker pull nginx Using default tag: latest Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? |
その他の特長は、多分あるんでしょうが、今のぼくにはわかりません。
使ってみる
READMEに書いてある項目を一通り試してみます。手元にあるMacbookで実行します。Docker Desktopは、落としておきます。当然dockerコマンドは、動きません。
1 2 3 4 5 |
$ docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? $ docker images Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? |
インストール
Macの場合は、Homebrewでインストールできます。
1 2 3 4 5 |
$ brew install skopeo ... $ skopeo -v skopeo version 1.0.0 |
コンテナイメージを参照する
skopeo inspect
で、リモートレジストリ上のコンテナイメージを調べてみます。リモートレジストリのイメージを指定する際は、docker://<image-name>
のように指定します。必要に応じて、--creds
オプションで、レジストリへの認証情報をセットする必要があります。
対象となるイメージは、下記の記事において、gitlab-ciでビルドし、gitlab.com上のコンテナレジストリにpushしたものです。
したがって、skopeo
コマンドを打っているマシンにpullしていませんが、ちゃんとコンテナイメージの情報が表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ skopeo inspect cat { "Name": "registry.gitlab.com/nishipy/docker-ansible-jupyter", "Digest": "sha256:24745a60c4de8504c0dc002908da83067f1477d9d4554c19922d1ca1ce38e58a", "RepoTags": [ "latest" ], "Created": "2020-04-25T11:57:41.10246361Z", "DockerVersion": "19.03.8", "Labels": { "maintainer": "nishipy.com" }, "Architecture": "amd64", "Os": "linux", "Layers": [ "sha256:cbdbe7a5bc2a134ca8ec91be58565ec07d037386d1f1d8385412d224deafca08", "sha256:6c09a9f636ab4e91f1d9ae933641f30f5146c41fba55140e79b404e1081a927a", "sha256:1ace2061c0c17db6290e60fc6203ee3e727a562eff1c1472e69d864fbc37ec73", "sha256:244ee9b43d5c7805f8ad272bdfcb881dd38fee5a2b9f73fa378dc1faa5b258d5" ], "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "LANG=ja_JP.UTF-8", "JP_PORT=8888", "JP_USER=jupyter" ] } |
コンテナイメージをコピーする
次は、コンテナイメージを別のコンテナレジストリにコピーしてみます。先ほど扱ったGitLab上のイメージを、Quayへコピーします。必要に応じて、--src-creds
オプションや--dest-creds
オプションで、コピー元とコピー先レジストリへの認証情報をセットする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ skopeo copy docker://registry.gitlab.com/nishipy/docker-ansible-jupyter docker://quay.io/nishipy/ansible-jupyter --dest-creds=USER:P455W0RD Getting image source signatures Copying blob cbdbe7a5bc2a done Copying blob 1ace2061c0c1 done Copying blob 244ee9b43d5c done Copying blob 6c09a9f636ab done Copying config 98fe03c1fe done $ skopeo inspect docker://quay.io/nishipy/ansible-jupyter --creds=USER:P455W0RD { "Name": "quay.io/nishipy/ansible-jupyter", "Digest": "sha256:24745a60c4de8504c0dc002908da83067f1477d9d4554c19922d1ca1ce38e58a", "RepoTags": [ "latest" ], "Created": "2020-04-25T11:57:41.10246361Z", "DockerVersion": "19.03.8", "Labels": { "maintainer": "nishipy.com" }, "Architecture": "amd64", "Os": "linux", "Layers": [ "sha256:cbdbe7a5bc2a134ca8ec91be58565ec07d037386d1f1d8385412d224deafca08", "sha256:6c09a9f636ab4e91f1d9ae933641f30f5146c41fba55140e79b404e1081a927a", "sha256:1ace2061c0c17db6290e60fc6203ee3e727a562eff1c1472e69d864fbc37ec73", "sha256:244ee9b43d5c7805f8ad272bdfcb881dd38fee5a2b9f73fa378dc1faa5b258d5" ], "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "LANG=ja_JP.UTF-8", "JP_PORT=8888", "JP_USER=jupyter" ] } |
ちゃんとコピーできています。
コンテナイメージをダウンロードする
Quayにコピーしたコンテナイメージを、ローカルディレクトリにダウンロードしてみます。ダウンロードするディレクトリは、dir:
で指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ mkdir -p /tmp/skopeotest $ skopeo copy docker://quay.io/nishipy/ansible-jupyter dir:/tmp/skopeotest --src-creds=USER:P455W0RD Getting image source signatures Copying blob cbdbe7a5bc2a done Copying blob 6c09a9f636ab done Copying blob 1ace2061c0c1 done Copying blob 244ee9b43d5c done Copying config 98fe03c1fe done Writing manifest to image destination Storing signatures $ ll /tmp/skopeotest/ total 367104 drwxr-xr-x 9 nishipy wheel 288 Jun 2 20:09 . drwxrwxrwt 18 root wheel 576 Jun 2 20:09 .. -rw-r--r-- 1 nishipy wheel 299 Jun 2 20:09 1ace2061c0c17db6290e60fc6203ee3e727a562eff1c1472e69d864fbc37ec73 -rw-r--r-- 1 nishipy wheel 299 Jun 2 20:09 244ee9b43d5c7805f8ad272bdfcb881dd38fee5a2b9f73fa378dc1faa5b258d5 -rw-r--r-- 1 nishipy wheel 182493839 Jun 2 20:09 6c09a9f636ab4e91f1d9ae933641f30f5146c41fba55140e79b404e1081a927a -rw-r--r-- 1 nishipy wheel 3623 Jun 2 20:09 98fe03c1fe6f6779e10442126dc80a1732febdbdd8e3ad0734824f7aea6e2aab -rw-r--r-- 1 nishipy wheel 2813316 Jun 2 20:09 cbdbe7a5bc2a134ca8ec91be58565ec07d037386d1f1d8385412d224deafca08 -rw-r--r-- 1 nishipy wheel 1155 Jun 2 20:09 manifest.json -rw-r--r-- 1 nishipy wheel 33 Jun 2 20:09 version |
よくわからない名前のファイルがダウンロードされました。manifest.json
を覗いてみると、コンテナイメージのlayerごとに圧縮したファイルのようですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ cat /tmp/skopeotest/manifest.json { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 3623, "digest": "sha256:98fe03c1fe6f6779e10442126dc80a1732febdbdd8e3ad0734824f7aea6e2aab" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 2813316, "digest": "sha256:cbdbe7a5bc2a134ca8ec91be58565ec07d037386d1f1d8385412d224deafca08" }, { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 182493839, "digest": "sha256:6c09a9f636ab4e91f1d9ae933641f30f5146c41fba55140e79b404e1081a927a" }, { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 299, "digest": "sha256:1ace2061c0c17db6290e60fc6203ee3e727a562eff1c1472e69d864fbc37ec73" }, { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 299, "digest": "sha256:244ee9b43d5c7805f8ad272bdfcb881dd38fee5a2b9f73fa378dc1faa5b258d5" } ] |
コンテナイメージを削除する
最後に、Quayにコピーしたコンテナイメージを削除しておきます。
1 |
$ skopeo delete docker://quay.io/nishipy/ansible-jupyter --creds=USER:P455W0RD |
これで、一通りのオペレーションは試せました。他にも、skopeo manifest-digest
やskopeo sysnc
などのコマンドがありますが、一旦省略します。気になる方は、以下のリファレンスを参照ください。
さいごに
skopeo
が対応する、コンテナイメージの操作を一通りやってみました。個人的には、skopeo
を使う機会は今後どんどん増えていきそうで、もっと慣れていきたいと思います。宗教上の理由がない皆さんも、試してみてはいかがでしょうか。
以上.
コメント