はじめに
Raspberry Piの上にDocker環境を作って、Metabaseをコンテナとして起動する時のメモ。
環境
- Raspberry Pi 3 Model B
$ 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インストール
こちらを参考にインストール。
$curl -sSL https://get.docker.com | sh
バージョン確認。
$docker --version
Docker version 20.10.3, build 48d30b5
次にdocker-composeをインストール。
$sudo pip3 install docker-compose
Metabaseコンテナ作成
結論として最終的に動いた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用のコンテナイメージでないと動かない
こちらにも記載されているように、CPUアーキテクチャーがARMのため、Metabaseの公式ドキュメントに書かれている、次のコマンドだと動かないです。
docker run -d -p 3000:3000 --name metabase metabase/metabase
DockerhubのARM用のコンテナイメージの一覧から選ぶのですが、2021年2月23日時点でMetabaseのイメージはありませんでした。
Metabaseをローカルにインストールする方法に記載されているように、Java(今回はAdoptOpenJDKを使用)環境があるarm32v7/adoptopenjdk:11.0.10_9-jdk-hotspot
というイメージを使いました。
apt update
でエラー発生(signature error)
最初にDockerイメージに入ってapt update
をしたらsignature errorが発生して実行できず。
調べてみると、まさにarm32v7のubuntuイメージで発生するようなエラーのようです。
こちらの記事によるとlibseccomp
というファイルに起因するエラーのようで、最新版をダウンロードしてインストールすることで回避できるとのこと。
なお、これはコンテナ内の問題ではなくて、ホスト側のラズパイ側の問題のようなので、ラズパイのコンソール上で以下のページで最新版のlibseccompを持ってきて、インストールします。
http://ftp.debian.org/debian/pool/main/libs/libseccomp/
$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で起動
以下のようにディレクトリ構造を用意しました。
$ tree
.
├── docker-compose.yaml
├── metabase
│ ├── Dockerfile
│ └── data
├── postgres
│ ├── data
│ └── init
│ └── create_db.sql
└── reverse-proxy
└── nginx.conf
docker-compose.yaml
は次の通りで、Metabaseの他にDB(PostgreSQL)とリバースプロキシ用のnginxを用意しています。
(リバプロは不要ですが、作ってみたかっただけです)
$ 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 DATABASE qiita_db;
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;
}
}
}
あとは起動します。
$docker-compose up -d
$ 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
です。
※ 本当は初期設定画面が表示されますが、キャプチャは設定後のログイン画面になります(すみません、キャプチャし忘れました)。