zaki work log

作業ログやら生活ログやらなんやら

[Oracle Linux] arm64アーキテクチャのA1.FlexのVMでDocker版NetBoxをビルド&デプロイする (Ubuntu / Oracle Linux)

Oracle Cloudで無料で使えるA1.FlexシェイプのVM(arm64アーキテクチャ)でNetBoxをDockerでデプロイしてみました。
NetBoxのコンテナイメージはamd64版しか公開されていないため、arm64アーキテクチャでコンテナ版をデプロイするには、自前でビルドする必要があります。 ただ、ビルドのためのスクリプト類は用意されてるので、簡単にビルドできます。

ビルド自体は以前試したここの手順の通りで、NetBox本体のリポジトリのtag名などを指定すれば、そのバージョンのイメージをビルドできます。

zaki-hmkc.hatenablog.com

Oracle Cloud A1.FlexのインスタンスへのDockerエンジン本体のインストールはこちら
Docker Composeのインストールはpip版Docker Plugin版どちらかでインストールする。本エントリではDocker PluginとしてインストールしたCompose v2でお試し。

Ubuntu 20.04 / Oracle Linux 8

$ git clone -b release https://github.com/netbox-community/netbox-docker.git
$ cd netbox-docker/

で、本来であれば必要に応じてdocker-compose.override.ymlを用意したりし、upすればデプロイできるのですが、

netbox-docker-netbox-1               | standard_init_linux.go:228: exec user process caused: exec format error
netbox-docker-netbox-1 exited with code 1

起動に失敗します。
これは、NetBoxのコンテナイメージがamd64向けしか公開されておらず、でも実行しようとしてるプラットフォームはarm64のため起動に失敗している状態のため、何をどう頑張っても起動できません。

f:id:zaki-hmkc:20210930230153p:plain

$ docker run --rm netboxcommunity/netbox:v3.0 
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
standard_init_linux.go:228: exec user process caused: exec format error

じゃあどうすればいいかと言うと、実行したいプラットフォーム用のイメージを自分でビルドすれば(今回動かしたいNetBoxについては)OKです。
NetBoxのコンテナイメージは、(わかりにくいけど)alpineがベースイメージになっていて、このイメージはarm64用が用意されているため、このイメージをベースにビルドします。特定プラットフォーム用のビルドというとクロスコンパイルみたいなイメージがありますが、単に動かしたいarm64のプラットフォーム(のDockerエンジン)上でビルドすればOKです。

f:id:zaki-hmkc:20210930230417p:plain

NetBoxのコンテナイメージビルドは、デプロイに使用するComposeファイルを提供しているnetbox-dockerリポジトリに、ビルド用のスクリプトも同梱しているため、そのスクリプトを実行すればよいので簡単にビルドできます。

github.com

2021.09.30時点で最新のv3.0.4でお試し。
ビルドスクリプトの引数に、NetBox本体のリポジトリのターゲットバージョンのtagを指定します。

github.com

$ ./build.sh v3.0.4

ビルドはこれだけ。そこそこ時間かかる。
ビルド完了すると以下の通り。

$ docker image ls
REPOSITORY               TAG           IMAGE ID       CREATED         SIZE
netboxcommunity/netbox   latest-ldap   955e60dabcfc   4 minutes ago   442MB
netboxcommunity/netbox   v3.0-ldap     955e60dabcfc   4 minutes ago   442MB
netboxcommunity/netbox   v3.0.4-ldap   955e60dabcfc   4 minutes ago   442MB
netboxcommunity/netbox   latest        cffca943100b   4 minutes ago   436MB
netboxcommunity/netbox   v3.0          cffca943100b   4 minutes ago   436MB
netboxcommunity/netbox   v3.0.4        cffca943100b   4 minutes ago   436MB

v3.0のタグを含めてビルドできてるので、そのままdocker compose upします。
(標準で用意されているdocker-compose.ymlv3.0タグ前提の記述なので)

$ docker compose up 
[+] Running 6/6
 ⠿ Container netbox-docker-redis-cache-1          Creat...                                         0.0s
 ⠿ Container netbox-docker-postgres-1             Created                                          0.0s
 ⠿ Container netbox-docker-redis-1                Created                                          0.0s
 ⠿ Container netbox-docker-netbox-housekeeping-1  Recreated                                        0.1s
 ⠿ Container netbox-docker-netbox-worker-1        Rec...                                           0.1s
 ⠿ Container netbox-docker-netbox-1               Recreated                                        0.1s
Attaching to netbox-docker-netbox-1, netbox-docker-netbox-housekeeping-1, netbox-docker-netbox-worker-1, netbox-docker-postgres-1, netbox-docker-redis-1, netbox-docker-redis-cache-1
netbox-docker-redis-cache-1          | 1:C 30 Sep 2021 12:11:13.783 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

[...]

netbox-docker-netbox-1               | ✅ Initialisation is done.
netbox-docker-netbox-1               | ⏳ Waiting for control socket to be created... (1/10)
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [warn] 7#7 Unit is running unprivileged, then it cannot use arbitrary user and group.
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [info] 7#7 unit started
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [info] 20#20 discovery started
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [notice] 20#20 module: python 3.9.5 "/usr/lib/unit/modules/python3.unit.so"
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [info] 7#7 controller started
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [notice] 7#7 process 20 exited with code 0
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [info] 22#22 router started
netbox-docker-netbox-1               | 2021/09/30 12:12:15 [info] 22#22 OpenSSL 1.1.1l  24 Aug 2021, 101010cf
netbox-docker-netbox-1               | ⚙️ Applying configuration from /etc/unit/nginx-unit.json
netbox-docker-netbox-1               | 2021/09/30 12:12:16 [info] 26#26 "netbox" application started
netbox-docker-netbox-1               | 🧬 loaded config '/etc/netbox/config/configuration.py'
netbox-docker-netbox-1               | 🧬 loaded config '/etc/netbox/config/extra.py'
netbox-docker-netbox-1               | 🧬 loaded config '/etc/netbox/config/logging.py'
netbox-docker-netbox-1               | 🧬 loaded config '/etc/netbox/config/plugins.py'
netbox-docker-netbox-1               | ✅ Unit configuration loaded successfully
netbox-docker-netbox-1               | 2021/09/30 12:12:18 [notice] 7#7 process 18 exited with code 0

はい。
あとはセキュリティグループなどの設定を確認しつつwebアクセスすればこの通り。

f:id:zaki-hmkc:20210930230721p:plain

Oracle Linux 7.9の場合

Gitバージョンでトラップあるので注意。
それ以外はUbuntu 20.04 / Oracle Linux 8と同じ。

$ ./build.sh v3.0.4
▶️ ./build.sh v3.0.4
🌐 Checking out 'v3.0.4' of NetBox from the url 'https://github.com/netbox-community/netbox.git' into '.netbox'
Note: checking out '84d83fbd143f26097db9464a46657b7a65ab27cb'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

fatal: git fetch-pack: expected shallow list

標準リポジトリyum installできるGitのバージョンが1系のため、必要な操作ができないエラーになります。

$ git version
git version 1.8.3.1

IUSのリポジトリからインストールできたら簡単かな?と思ったけど、あいにくこのリポジトリではarm64版のパッケージはありません。
探した結果、Oracle Linux 7.9では標準リポジトリrh-git218-git-all.noarchというパッケージが用意されています。(名前…いいのかな、これw)

$ sudo yum install rh-git218-git-all

このパッケージをインストールすると、/opt/rh/rh-git218/root/usr/bin/gitにv2系のGitがインストールされます。

$ /opt/rh/rh-git218/root/usr/bin/git version
git version 2.18.4

PATH設定してリビルド

$ export PATH=/opt/rh/rh-git218/root/usr/bin:$PATH
$ ./build.sh v3.0.4
▶️ ./build.sh v3.0.4
/opt/rh/rh-git218/root/usr/libexec/git-core/git-remote-https: error while loading shared libraries: libcurl-httpd24.so.4: cannot open shared object file: No such file or directory
❌ Remote branch 'v3.0.4' not found in 'https://github.com/netbox-community/netbox.git'; Nothing to do

をしようとすると、更にエラー。
検索すると以下がヒット。

bugzilla.redhat.com

$ sudo ln -s /opt/rh/httpd24/root/usr/lib64/libcurl-httpd24.so.4 /lib64/

この状態で更にリビルトしようとすると、同じように以下のエラー

$ ./build.sh v3.0.4
▶️ ./build.sh v3.0.4
/opt/rh/rh-git218/root/usr/libexec/git-core/git-remote-https: error while loading shared libraries: libnghttp2-httpd24.so.14: cannot open shared object file: No such file or directory
❌ Remote branch 'v3.0.4' not found in 'https://github.com/netbox-community/netbox.git'; Nothing to do

これも同様に、

$ sudo ln -s /opt/rh/httpd24/root/usr/lib64/libnghttp2-httpd24.so.14 /lib64/

する。
今度こそリビルド。

$ ./build.sh v3.0.4

しばらく待てばビルド完了するはず。

$ docker image ls
REPOSITORY               TAG           IMAGE ID       CREATED              SIZE
netboxcommunity/netbox   latest-ldap   feae491462bb   41 seconds ago       442MB
netboxcommunity/netbox   v3.0-ldap     feae491462bb   41 seconds ago       442MB
netboxcommunity/netbox   v3.0.4-ldap   feae491462bb   41 seconds ago       442MB
netboxcommunity/netbox   latest        b746cc1f2603   About a minute ago   436MB
netboxcommunity/netbox   v3.0          b746cc1f2603   About a minute ago   436MB
netboxcommunity/netbox   v3.0.4        b746cc1f2603   About a minute ago   436MB

[...]

あとは同じようにdocker-compose.override.ymlを作成し、docker compose up -dでデプロイできます。

$ docker compose up -d
[+] Running 1/3
 ⠴ redis-cache Pulling                                                                                          1.6s
   ⠿ 552d1f2373af Already exists                                                                                0.0s
   ⠋ 08b93f529d04 Waiting                                                                                       0.1s
[+] Running 1/169 Waiting                                                                                       0.1s
 ⠦ redis-cache Pulling                                                                                          1.7s

[...]

現状だとHTTPアクセスになっており経路が暗号化されないのでその点は注意。
あくまでお試しということで、セキュリティグループで自分のIPアドレスでのみアクセスできるようにするなどフィルタした方がよい。