LoginSignup
10
7

More than 3 years have passed since last update.

Docker-compose.yml の volumes を勉強する

Posted at

はじめに

いつものように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つ賢くなれました。
ファイルの中身はまだまだ全てを把握しきれていませんが、エラーを乗り越えていく中で少しずつ学習していきたいです。

10
7
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
10
7