はじめに
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) の場合は↓も必要。
GOOD: Named Volume をマウントする
Docker の Named 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 先生のおかげで助かりました。