13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

docker cp使って簡単永続化

Last updated at Posted at 2019-06-05

コンテナ内でいじったファイルを永続化するファイルを用意したい

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の一部です。

docker-compose.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のディレクトリも別にボリュームしようとしていました。こちらです。

docker-compose.yml
    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と同じ階層構造になったボリューム用ディレクトリをローカルに用意するのが大事なのです。

13
12
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
13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?