背景
完全にオフラインな Ubuntu で Python を動かしたいという場面に遭遇しました。完全オフラインサーバなので pip も使えず、必要なモジュールをインストールすることは不能。そこでオンラインサーバでスクリプトをコンテナ化し、オフラインサーバでコンテナを起動する方法を考えたのですが、そもそもオフラインサーバなので docker のインストールもできず。
そこでオンラインサーバで docker の snap ファイルをダウンロードし、オフラインサーバにインストールする方法を試したとろ、上手くいったのでその方法のまとめです。
オンライン Ubuntu でファイルをダウンロード
まずオンラインの Ubuntu で docker の snap パッケージをダウンロードします。ここで、docker の snap パッケージだけダウンロードすれば良さそうに思えますが、Ubuntu のバージョンが違うと snap のバージョンが合わず動かなかったりするので snap, core22, docker の 3 つのファイルを落としておきます。
実際の出力は下記のようになります。
root@localhost:~# snap download snapd
Fetching snap "snapd"
Fetching assertions for "snapd"
Install the snap with:
snap ack snapd_23258.assert
snap install snapd_23258.snap
root@localhost:~#
root@localhost:~# snap download docker
Fetching snap "docker"
Fetching assertions for "docker"
Install the snap with:
snap ack docker_2963.assert
snap install docker_2963.snap
root@localhost:~#
root@localhost:~# snap download core22
Fetching snap "core22"
Fetching assertions for "core22"
Install the snap with:
snap ack core22_1722.assert
snap install core22_1722.snap
root@localhost:~#
下記のようなファイルがダウンロードされますので、これをオフラインサーバにコピーします。
root@localhost:~# ls -lh
total 258M
-rw-r--r-- 1 root root 4.5K Dec 23 04:17 core22_1722.assert
-rw------- 1 root root 74M Dec 23 04:17 core22_1722.snap
-rw-r--r-- 1 root root 5.1K Dec 23 04:17 docker_2963.assert
-rw------- 1 root root 140M Dec 23 04:17 docker_2963.snap
-rw-r--r-- 1 root root 4.5K Dec 23 04:16 snapd_23258.assert
-rw------- 1 root root 45M Dec 23 04:16 snapd_23258.snap
オフライン Ubuntu でインストール
オフラインサーバでは、下記の順序でコマンドを実行するだけです。
snap ack snapd_23258.assert
snap install snapd_23258.snap
snap ack core22_1722.assert
snap install core22_1722.snap
snap ack docker_2963.assert
snap install docker_2963.snap
これだけで docker が使えるようになります。簡単ですね!
最後に
上記の方法で Ubuntu 20.04, 22.04, 24.04 すべてのオフライン Ubuntu に docker 環境を構築することができました。あとはスクリプトをコンテナイメージにしてコピーすればどの環境でも動作します。改めてコンテナの便利さを実感しました。