Raspberry Pi上のDocker環境でMetabase構築

# はじめに

Raspberry Piの上にDocker環境を作って、Metabaseをコンテナとして起動する時のメモ。

# 環境

- Raspberry Pi 3 Model B

```bash
$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```

なお、ラズパイの初期設定などは他の記事などを参考にしてください。

# やったこと

## Docker / docker-composeインストール

[こちら](https://qiita.com/k_ken/items/0f2d6af2618618982723#raspberry-pi%E3%81%ABdocker%E3%81%A8docker-compose%E3%82%92%E5%B0%8E%E5%85%A5)を参考にインストール。

```bash
$curl -sSL https://get.docker.com | sh
```

バージョン確認。

```bash
$docker --version
Docker version 20.10.3, build 48d30b5
```

次にdocker-composeをインストール。

```bash

$sudo pip3 install docker-compose
```

## Metabaseコンテナ作成

結論として最終的に動いたDockerfileは次の通り。

```Dockerfile
FROM arm32v7/adoptopenjdk:11.0.10_9-jdk-hotspot

RUN mkdir /apps
WORKDIR /apps/

RUN apt update
RUN apt install -y wget
RUN wget https://downloads.metabase.com/v0.38.0.1/metabase.jar

EXPOSE 3000

CMD java -jar metabase.jar
```

コンテナを動かすまでに2つ引っかかった点がありました。

### ARM用のコンテナイメージでないと動かない

[こちら](https://qiita.com/k_ken/items/0f2d6af2618618982723#docker-buildx)にも記載されているように、CPUアーキテクチャーがARMのため、[Metabaseの公式ドキュメント](https://www.metabase.com/docs/latest/operations-guide/running-metabase-on-docker.html)に書かれている、次のコマンドだと動かないです。

```
docker run -d -p 3000:3000 --name metabase metabase/metabase
```

[DockerhubのARM用のコンテナイメージの一覧](https://hub.docker.com/u/arm32v7/?page=1)から選ぶのですが、2021年2月23日時点でMetabaseのイメージはありませんでした。
[Metabaseをローカルにインストールする方法](https://www.metabase.com/docs/latest/operations-guide/running-the-metabase-jar-file.html)に記載されているように、Java（今回はAdoptOpenJDKを使用）環境がある`arm32v7/adoptopenjdk:11.0.10_9-jdk-hotspot`というイメージを使いました。

### `apt update`でエラー発生（signature error）

最初にDockerイメージに入って`apt update`をしたらsignature errorが発生して実行できず。
調べてみると、まさにarm32v7のubuntuイメージで発生するようなエラーのようです。
[こちらの記事](https://askubuntu.com/questions/1263284/apt-update-throws-signature-error-in-ubuntu-20-04-container-on-arm)によると`libseccomp`というファイルに起因するエラーのようで、最新版をダウンロードしてインストールすることで回避できるとのこと。

なお、これはコンテナ内の問題ではなくて、ホスト側のラズパイ側の問題のようなので、ラズパイのコンソール上で以下のページで最新版のlibseccompを持ってきて、インストールします。
http://ftp.debian.org/debian/pool/main/libs/libseccomp/

```bash
$wget http://ftp.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.1-1_armhf.deb
$sudo dpkg -i libseccomp2_2.5.1-1_armhf.deb 
```

## DBも併せてdocker-composeで起動

以下のようにディレクトリ構造を用意しました。

```bash

$ tree
.
├── docker-compose.yaml
├── metabase
│   ├── Dockerfile
│   └── data
├── postgres
│   ├── data
│   └── init
│       └── create_db.sql
└── reverse-proxy
    └── nginx.conf

```

`docker-compose.yaml`は次の通りで、Metabaseの他にDB（PostgreSQL）とリバースプロキシ用のnginxを用意しています。
（リバプロは不要ですが、作ってみたかっただけです）

```docker-compose.yaml
$ cat docker-compose.yaml 
version: '3'

services:
  metabase:
    build: ./metabase
    container_name: metabase
    ports:
      - 3000:3000
    volumes:
      - ./metabase/data:/metabase-data
    environment:
      - MB_DB_FILE=/metabase-data/metabase.db

  postgres:
    image: arm32v7/postgres:latest
    ports:
      - 5432:5432
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password

  reverse-proxy:
    image: arm32v7/nginx:latest
    volumes:
      - ./reverse-proxy/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80
    depends_on:
      - metabase
```

`create_db.sql`と`nginx.conf`については以下の通りですが、大したことはしていないです。
リバプロはMetabaseへプロキシしているだけです。

```create_db.sql 
CREATE DATABASE qiita_db;
```

```nginx.conf
events {
    worker_connections  16;
}
http {
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_send_timeout 300;
    
    server {
        listen 80;
        server_name localhost;
        location / {
            proxy_pass http://metabase:3000/;
            proxy_redirect off;
        }
    }
}
```

あとは起動します。

```bash
$docker-compose up -d
```

```bash
$ docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED        STATUS        PORTS                    NAMES
0bb0fee61322   arm32v7/postgres:latest   "docker-entrypoint.s…"   25 hours ago   Up 25 hours   0.0.0.0:5432->5432/tcp   apps_postgres_1
db1acb60d29a   apps_metabase             "/bin/sh -c 'java -j…"   2 days ago     Up 2 days     0.0.0.0:3000->3000/tcp   metabase
7d6394803990   arm32v7/nginx:latest      "/docker-entrypoint.…"   2 days ago     Up 2 days     0.0.0.0:80->80/tcp       apps_reverse-proxy_1
```

## 動作確認

同じLAN内の別PCからブラウザで
`http://<ラズパイのIPアドレス>`
にアクセスすると無事にMetabaseの画面が表示されました。
※ 自分の環境だとラズパイのIPアドレスは`192.168.0.20`です。
※ 本当は初期設定画面が表示されますが、キャプチャは設定後のログイン画面になります（すみません、キャプチャし忘れました）。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/ec5feb80-6ee5-8ad2-4e4a-7d1ef4cb4a98.png)

# 参考

- https://qiita.com/k_ken/items/0f2d6af2618618982723#raspberry-pi%E3%81%ABdocker%E3%81%A8docker-compose%E3%82%92%E5%B0%8E%E5%85%A5
- https://askubuntu.com/questions/1263284/apt-update-throws-signature-error-in-ubuntu-20-04-container-on-arm
- https://qiita.com/mabubu0203/items/5cdff1caf2b024df1d95