コンテナ内でいじったファイルを永続化するファイルを用意したい
volumesを使うには、ディレクトリ内に共有化するためのディレクトリを切ってその中にファイルを入れておくのがセオリー。今回は、そのファイルを用意する時に便利なコマンド、docker cpを覚書として記します。
今まで必死にコピぺってた
コンテナの中に入って、例えば、php.iniをいじった、httpd.confをいじったなどの大量の設定が書いてあるファイルの一部を変更し、その一部を永続化させたい場合、ファイルを作ってボリュームさせました。その時にコンテナにあるファイルの中身をcatさせるなり、vi使うなりして開いてテキストをコピーして、ボリュームさせるためにファイルを作ってそこにペーストして・・・というなんとも不毛な作業をやっていた。
##おお、開発者よ、docker cpを使いなさい
docker cpを使えば、コンテナ内のファイルをそのままローカルの開発環境の好きな場所へコピーすることができます。間違えやすいのが、このコマンドの最初の引数であるCONTAINER IDです。**間違ってIMAGE IDを引数にしないようにしてください。**Error: No such container:path:というエラーが出てしまいます。docker ps使えないとできないということは、コンテナとして立ち上がっている必要があるということを意味します。
CONTAINER IDはdocker psで見ることができます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0**7bf48**5f 5***b2dd4**c "/bin/bash" 8 minutes ago Up 8 minutes sleepy_northcutt
みたいに出てきます。これのCONTAINER IDを引数に使います。
$ docker cp CONTAINER ID:コンテナ内のコピーしたいファイルまでのパス/コピーしたいファイル名 コピーしたいローカルのパス
#例
$ docker cp ****059f***24f:/usr/local/etc/php/conf.d/php.ini ./
こうやってコピーしたファイルを書き換えて、docker-compose.ymlにボリュームする記述をしてあげれば、
こちら実際にボリュームしたymlの一部です。
volumes:
- "./wp:/var/www/html"
- "./src:/usr/src/development"
- "./php-conf:/usr/local/etc/php"
これでOK!!
ボリュームする際は、ボリューム先のディレクトリ構造も真似る(コピーする)
ボリュームするphp_confのディレクトリはボリューム先のコンテナ内のOSのphp_confと同じ階層構造になっていなくてはならないというのは当然なのですが、最初、自分はディレクトリに意識がいきすぎて、このphp_confの下にあるconf.dのディレクトリも別にボリュームしようとしていました。こちらです。
volumes:
- "./wp:/var/www/html"
- "./src:/usr/src/development"
- "./php-conf:/usr/local/etc/php"
- "./conf.d:/usr/local/etc/php/conf.d"
これ、エラー出ちゃいます。わざわざローカルにconf.dを作ってその中のファイルを先にボリュームしたphp-confの中に更にボリュームしようと考えたんですね。
これよりも前に書いたphp_confのボリュームが1行になっている書き方が正解なのです。ローカルに用意したボリュームするphp_confディレクトリの中にconf.dも入れてしまってあげるんですね。つまり、ボリューム先のOSと同じ階層構造になったボリューム用ディレクトリをローカルに用意するのが大事なのです。