問題
Prometheus公式のDocekrイメージを使い、以下の設定でPrometheusをデプロイ。
docker-compose.yml
volumes:
- /data/prometheus:/prometheus
デプロイ後にログを確認すると、
err="opening storage failed: lock DB directory: open /prometheus/lock: permission denied"
というエラーでコンテナが停止していた。
原因
Prometheus公式のDockerfile
Dockerfile
...
RUN mkdir -p /prometheus && \
chown -R nobody:nogroup etc/prometheus /prometheus
USER nobody
EXPOSE 9090
...
/data/prometheusのディレクトリ情報 (例)
$ ls -l /data
drwxrwxr-x 3 user1 users 4096 5月 21 00:00 prometheus/
Dckerfileを見るとUSER nobodyが設定されている。
そのためnobodyユーザでディレクトリに書き込みが行われるが、
マウントした/data/prometheusディレクトリの所有者がnobodyではなかったためエラーになってしまった。
ちなみに、Prometheusコンテナの/prometheusディレクトリのパーミッションは、
デフォルトで以下のようになっている。
$ ls -l /
drwxr-xr-x 3 nobody nogroup 4096 May 21 00:00 prometheus
解決策
1. 実行ユーザをrootに変更する
rootユーザでPrometheusを実行する。
rootユーザで書き込みが行われるためエラーにならないが、
コンテナに必要以上の権限を持たせてしまうためおすすめしない。
docker-compose.ymlにuser: root
を追記
docker-compose.yml
version: "2"
services:
prometheus:
image: prom/prometheus:v2.9.2
container_name: prometheus
user: root #追記
ports:
- 9090:9090
volumes:
- /data/prometheus:/prometheus
2. その他ユーザにread, write権限を追加する
誰でも読み書きできるようになってしまうので注意が必要。
chmodでパーミッションを変更
$ sudo chmod 777 /data/prometheus
3. ディレクトリの所有者を変更する
chownで所有者を変更
$ sudo chown nobody /data/prometheus
合わせてディレクトリのグループを管理者のグループに設定しておく。
$ sudo chgrp monitor /data/prometheus