LoginSignup
7
5

More than 5 years have passed since last update.

Docker for WindowsでData Volume内のディレクトリの権限を変更する

Last updated at Posted at 2018-03-07

きっかけ

docker for windowsでpostgresqlを動かす時、データを永続化させたいのでData Volumeを使用しました。

Dockerfile
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
docker-compose.yml
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が使えるならなんでもいいです。

Dockerfile
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に接続して権限を変更しないといけないのが面倒です。

解決策があればコメント等で教えていただけると助かります。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5