きっかけ
docker for windowsでpostgresqlを動かす時、データを永続化させたいのでData Volumeを使用しました。
FROM postgres:8.4
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
version: "3.3"
services:
postgresql:
build: .
ports:
- "5432:5432"
volumes:
- datastore:/var/lib/postgresql/data
volumes:
datastore
これでコンテナを再作成してもデータが残るようになりました。
ただ致命的な問題があって、コンテナを一度削除して同じコンテナを作成すると
$ docker-compose up
Creating ...
Creating ... done
Attaching to
| FATAL: データディレクトリ"/var/lib/postgresql/data"はグループまたは第三者からアクセス可能です
| 詳細: 権限はu=rwx(0700)でなければなりません
exited with code 1
とエラーが発生してしまいます。
英語のエラーはこちら
Attaching to
| FATAL: data directory "/var/lib/postgresql/data" has group or world access
| DETAIL: Permissions should be u=rwx (0700).
exited with code 1
とりあえずエラーの詳細に書かれているように、マウント。されているローカルのディレクトリの権限を0700に変えることにしました。
volumeのマウント場所はvolume inspect <datastore名>
で知ることができます。
$ docker volume inspect docker_datastore
[
{
"CreatedAt": "2018-03-05T08:13:50Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "docker",
"com.docker.compose.volume": "datastore"
},
"Mountpoint": "/var/lib/docker/volumes/docker_datastore/_data",
"Name": "docker_datastore",
"Options": {},
"Scope": "local"
}
]
windowsなのに/var
?
どこにあるのでしょうか。。。
調べてるとDocker for WindowsはHyper-V
上でMobyLinuxVM.vhdx
が起動しており、この仮想環境内にマウントされていることがわかりました。
hyper-v上のMobyLinuxVM内にアクセスする
単純にhyper-VマネージャでMobyLinuxVMを起動しようとしても失敗してしまいます。
下記記事を参考にしてMobyLinuxVMにアクセスするコンテナを作成しました。
https://qiita.com/gentaro/items/cf666259cb6baf2eb8db
ただ、作業当時alpineのリポジトリとの接続がうまくいかなかったので(会社のproxyのせい?)、ubuntuにしました。
util-linuxが使えるならなんでもいいです。
FROM ubuntu
RUN apt-get update && \
apt-get install util-linux
ENTRYPOINT ["nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid"]
MobyLinuxVMに接続して権限を変更
$ docker build . -t hostenter
$ docker run -it --privileged --pid=host hostenter /bin/sh
/ #
/ # chmod 700 -r /var/lib/docker/volumes/docker_datastore/_data
問題点
コンテナ構築時にData Volumeの権限が変更されるため、Data Volumeに接続するコンテナを生成するたびに、MobyLinuxVMに接続して権限を変更しないといけないのが面倒です。
解決策があればコメント等で教えていただけると助かります。