Tech 4 Mine :-) 忘れぬ先のテックメモ

ゆるエンジニアな私が、多少なり役に立ったひらめきやらTipsを忘れる前に書いていくブログです。

Docker HubからDockerコマンドを使わずにイメージをダウンロードする

こんな状況に

ネットは繋がるけど、ユーザ権限が制限されてるWindowsからネットに繋がってない開発機に色々入れる必要がある。
Dockerは入れられたけどコンテナイメージは入れてなかったサーバにイメージ入れたいけど、使える端末はWindowsでOS機能が制限されていてDocker Desktopのデーモンが起動できない。

Docker Registory HTTP API

DockerにはAPIがあり、ざっくりと認証トークン取得→マニフェスト取得→BLOB取得→イメージ統合することでdocker save相当のイメージファイルがゲットできるようです。
マニフェスト取得までは自力でやってみましたが、既にPythonPowerShellでもスクリプト化してくれている方がいたので、挫折ついでにいくつか使ってみました。

Dockerを使わずにDocker Imageを取得するツールあれこれ

. docker-drag(docker_pull.py) 今回試したものその1。
docker-dragというPythonスクリプト、requestsを入れる必要有り。

. download-frozen-image-v2.sh

今回試したものその2。
Mobyプロジェクトに含まれるDocker Imageダウンロード用シェルスクリプト、jqとgoコマンドを入れる必要有り。

. Scopeo

試してないものの、GitHubでスター2.4Kと人気なプロダクトのようです。
今回はWindows非対応とのことで除外。

お試し1:docker-drag

以下の環境でお試ししています。
Windows 10
Python v3.8.2

Pythonについてはここではあまり触れません、インストール後、環境変数設定しておいてください。
そもそもPythonインストールなんて出来ないよ!って方はお試し2を御覧ください。

Pythonのインストールが終わったら依存モジュールをインストールします。

pip install requests

pipで入れられない!って方はPyPiのHPから、requestsと依存モジュール4個をダウンロードして、それぞれローカルインストールしましょう。
requestsのリポジトリから依存関係は下記のとおりです。

'chardet>=3.0.2,<4',
'idna>=2.5,<3',
'urllib3>=1.21.1,<1.26,!=1.25.0,!=1.25.1',
'certifi>=2017.4.17'

環境が整ったらReadmeにある通り実行するだけです。

// python docker_pull.py [image名]:[タグ]
python docker_pull.py mysql/mysql-server:8.0

プロキシ環境でhttps(Port 443) タイムアウトする場合はPythonのプロキシ設定をしましょう。

お試し2:download-frozen-image-v2.sh

以下の環境でお試ししています。
Windows 10
cygwin(WSLが利用不可な環境だったため) jq go 1.15

このシェルが、goとjqに依存するため、実行前にこの2つをセットアップしておきます。
goについては、Windows用のインストーラダウンロードして予めインストールしておきます。
bash的なことをするためcygwinをインストールして、ライブラリを追加する時に、jqを追加しておきます。ほかは特に変更なくて大丈夫でした。
WSLで実行される場合はaptやらyumやらでjqを調達する必要があります。(試してない)

セッティングが終わったら、以下の様にコマンドを実行することでイメージをダウンロード出来ます。

// ./download-frozen-image-v2.sh [DLディレクトリ] [image名]:[タグ]
./download-frozen-image-v2.sh ./ ubuntu:latest

プロキシ環境下ではPython同様、Proxy設定して実行してみてください。

PythonとかCygwinとか無理なんだけど

っていう方はPowerShellで同じようなものを作成されてる方がいましたので、そちらを参考にしてみてください。
PowerShell見ると眠くなる呪いさえなければ・・・

dockerless_docker_downloader

もっと便利なツールなどあればぜひとも教えて下さい!