craneコマンドでDockerイメージをダウンロード・アップロード

以前、Dockerのコンテナイメージダウンロードに graboidというツールを紹介したのですが、 今回はアップロード (docker push相当) もできるgoogleが開発しているツール crane を紹介します。

インストール

craneはGO製のコマンドラインツールで、go-containerregistry というプロジェクトの一部です。craneコマンド以外にもgcraneやk8schainといったコマンドが提供されています。今回は、tar.gz ファイルダウンロード後、craneファイルだけを取り出して、/user/local/bin に配置します。
※ Windows版は提供されていないので、今回はLinux環境が前提です。

# curl -L https://github.com/google/go-containerregistry/releases/download/v0.1.3/go-containerregistry_Linux_x86_64.tar.gz -o /tmp/go-containerregistry.tar.gz
# tar zxvf /tmp/go-containerregistry.tar.gz -O crane > /usr/local/bin/crane
# chmod 755 /usr/local/bin/crane
# rm -f /tmp/go-containerregistry.tar.gz

コンテナイメージのダウンロード (pull)

ダウンロード(pull)は、コンテナイメージのURLと保存先ファイル名(tar)を指定するだけです。DockerHub上のbusyboxコンテナをダウンロードしてみます。DockerHubにログインしてないため、No matching credentials were found というワーニングがでますが、無視して構いません。

# crane pull busybox busybox.tar
2020/09/25 08:01:42 No matching credentials were found, falling back on anonymous
# ls
busybox.tar

コンテナイメージのアップロード (push)

アップロード(push)も、認証が特にかかっていないレジストリの場合は、以下のようにtarファイル名とアップロード先URL(ここではmyregistry:5000というサーバを想定)を指定します。pullと引数が逆なので注意してください。

# crane push busybox.tar myregistry:5000/busybox:latest

認証は cran auth login サーバURL -u ユーザ名 -p パスワード コマンドできます。なお、パスワードをコマンドラインで対話的に入力する機能はないようです。パスワードを直接指定してDockerHubにログインしてみます。

# crane auth login docker.io -u myusername -p mypassword

コマンドラインに直接パスワードを入力したくない場合、-pオプションの代わりに--password-stdinオプションを使って、標準入力からパスワードを受け取ることができます。pass.txt というテキストファイルにパスワードを書いて、以下のようにログインできます。

cat pass.txt | crane auth login docker.io -u myusername --password-stdin

なお、ログインした場合 ~/.docker/config.json に認証情報が保存されます。つまり、Dockerがインストールされている環境で、docker login を実行している場合、新たに crane コマンドでログインする必要はありません。

ログイン後のpushは最初に紹介した方法と同じです。DockerHub だとpush先のパスにユーザ名が必要なので、以下のようなコマンドでpushできます。

# crane push busybox.tar myusername/busybox:latest
タイトルとURLをコピーしました