#はじめに
いつものようにDocker-compose.ymlを書いて(コピペして)docker-compose build
したら、下記のエラーが出ました。
ERROR: Named volume "mysql-data:/var/lib/mysql:rw"
is used in service "db" but no declaration was found in the volumes section.
google翻訳「名前付きボリューム「mysql-data:/ var / lib / mysql:rw」がサービス「db」で使用されていますが、ボリュームセクションに宣言が見つかりませんでした。」
なんのこっちゃ。
という訳でありまして、調べてみました。
#そもそもvolumeとは
コンテナが破棄されてもvolumeは残る。
つまり、データベースの中身を永続的に残すための領域を定義することらしい。
そしてその領域は他のコンテナからもアクセスできて、ホストのディレクトリをマウント出来るとのこと。
#実際に見てみる
下記は実際に動いているRailsのdocker-compose.ymlファイルの内容の一部です。
services:
db:
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
driver: local
servicesの中にdbとvolumesの2つがあり、ややこしいです。
1番左側でservicesと同じ高さにあるvolumesはNamed volume(名前付きボリューム)
を定義するためのもので、今回はmysql-data:
が名前付きボリュームとなっています。
その下のdriver: local
はlocalという名前のドライバー(プラグイン)を名前付きボリュームに設定するという意味です。
db:の中のvolumes:は名前付きボリュームであるmysql-data:
をコンテナ内のディレクトリである/var/lib/mysql
にマウントするという意味になります。
##python3やappのservice(コンテナ)にもvolumesがある
例えば
services:
python3:
volumes:
- ./tmp:/root/tmp
これはホスト側のディレクトリの./tmp
を自コンテナ専用のvolumeとして、コンテナ内のディレクトリである/root/tmp
にマウントしているという意味。
これでアプリケーションの実行に必要なファイル達がpython3というコンテナで使えるのです。
#エラーを解消する
今回は「ボリュームセクションに宣言が見つかりませんでした」とのことだったので、1番左側に来る名前付きボリュームを定義するvolumesが抜けていたのだと推測します。
docker-compose.yml
の1番下の1番左側に以下の内容を書き足します。
volumes:
mysql-data:
書き足したら、いつものように下記の手順でdocker-composeを立ち上げます。
$ docker-compose build
$ docker-compose up
#おわりに
docker-compose.ymlの書き方について1つ賢くなれました。
ファイルの中身はまだまだ全てを把握しきれていませんが、エラーを乗り越えていく中で少しずつ学習していきたいです。