Windows
PostgreSQL
Docker
postgres
docker-compose

Docker for Windows で postgres コンテナの Volume マウントを安全にする

More than 1 year has passed since last update.


はじめに

Docker でコンテナを使ってDBを動かすとき、コンテナを落としてもデータが消えないよう、多くの人はDBのデータディレクトリをホスト側にマウントすると思います。

本記事は PostgreSQL についてですが、他DBでも同様だと思われます。


BAD: ホストOSのDirectoryをマウントする

一番Basicな方法だと思いますが、Windowsですと Permission denied だとか、書き込み時に initdb: could not fsync file Errorが頻発します。頑張ってLinuxの仮想FileSystemをWindows上で再現しているので折り合いが悪い様子。

### (a) コマンド直打ちの場合

$ docker run -d -v ./data:/var/lib/postgresql/data postgres:9.6.3-alpine

### (b) docker-compose.yml の場合

version: '2'
services:
db:
image: postgres:9.6.3-alpine
volumes:
- ./data:/var/lib/postgresql/data

Windows10 (Docker for Windows) の場合は↓も必要。

sharedrives.png


GOOD: Named Volume をマウントする

DockerNamed Volume にマウントする方法で安定しました。

### (a) コマンド直打ちの場合

$ docker volume create dbdata
dbdata

$ docker volume ls
DRIVER VOLUME NAME
local dbdata

$ docker run -d -v dbdata:/var/lib/postgresql/data postgres:9.6.3-alpine

### (b) docker-compose.yml の場合

version: '2'
services:
db:
image: postgres:9.6.3-alpine
volumes:
- dbdata:/var/lib/postgresql/data

volumes:
dbdata:

データを消したい時はこうします。

$ docker volume ls

DRIVER VOLUME NAME
local dbdata
local dockerpostgres_dbdata # <-- docker-compose で作った方. 勝手にPrefixが付く

$ docker volume rm dbdata
dbdata


参考

今回も Stack Overflow 先生のおかげで助かりました。