Docker-Compose永続データMySQL


156

$ docker-compose down次のように実行すると、MySQLデータを永続化できないようです.yml

version: '2'
services:
  # other services

  data:
    container_name: flask_data
    image: mysql:latest
    volumes:
      - /var/lib/mysql
    command: "true"

  mysql:
    container_name: flask_mysql
    restart: always
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
      MYSQL_USER: 'test'
      MYSQL_PASS: 'pass'
    volumes_from:
      - data
    ports:
      - "3306:3306"

私の理解では、data使用しているコンテナでは、volumes: - /var/lib/mysqlmysqlがデータをコンテナに保存するローカルマシンのディレクトリにマップされます。このマッピングにより、コンテナが破棄された場合でもデータが保持されるはずです。そして、mysqlコンテナーは単なるdbへのクライアントインターフェイスであり、ローカルディレクトリを表示できます。volumes_from: - data

この答えを試してもうまくいかなかった。Docker-Compose永続データの問題

編集

.ymlを以下のように変更してディレクトリを作成しましたが、./data実行docker-compose up --buildするとmysqlコンテナが起動しなくなり、エラーがスローされます

  data:
    container_name: flask_data
    image: mysql:latest
    volumes:
      - ./data:/var/lib/mysql
    command: "true"

  mysql:
    container_name: flask_mysql
    restart: always
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
      MYSQL_USER: 'test'
      MYSQL_PASS: 'pass'
    volumes_from:
      - data
    ports:
      - "3306:3306"


flask_mysql | mysqld: Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)
flask_mysql | 2016-08-26T22:29:21.182144Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
flask_mysql | 2016-08-26T22:29:21.185392Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting.

回答:


222

データコンテナーは余分な回避策です。データボリュームはあなたのためのトリックを行います。次のように変更してくださいdocker-compose.yml

version: '2'
services:
  mysql:
    container_name: flask_mysql
    restart: always
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
      MYSQL_USER: 'test'
      MYSQL_PASS: 'pass'
    volumes:
      - my-datavolume:/var/lib/mysql
volumes:
  my-datavolume:

Dockerが/var/lib/docker/volumesフォルダーにボリュームを作成します。このボリュームは、入力していない限り存続しますdocker-compose down -v


18
MySQL 5.7.6以降では、Dockerイメージに(再度)権限の問題が発生mysqlます。代わりに、Dockerボリュームで問題なく動作するmariadbDockerイメージを使用できます。
Peterino、2016

この解決策は私にとってうまくいきました。補足事項/精度:2。上記の構成をdocker-compose.ymlで使用し、「docker stack deploy -c docker-compose.yml mystack」を使用してサービススタックをデプロイする場合、作成する必要はありません。手動でボリュームを作成すると、/ var / lib / docker / volumes / mystack_my-datavolumeとして自動的に作成されます(ボリューム名の先頭に「mystack_」が付加されていることに注意してください)。2.ディレクトリのアクセス許可を変更する必要はありませんでした。コンテナー内にmysql:rootが所有するファイルがある場合でも、Dockerホスト上で問題なく27:rootとして作成されました。
ジョーイコート

10
var/lib/docker/volumesようにプロジェクトフォルダーにディレクトリを作成する代わりに、なぜそれを保存したいのdata/mysqlですか?
ゴッドファーザー

@TheGodfather私の推測では、MySQLデータを本番マシンにデプロイしたくないと思います。そうでなければ、それはすべてを一緒に保つ非常に健全なアイデアです。
ダンカン

1
@louhow私は自分のアプリとデータのすべての部分がどういうわけか一緒に保存され、自分がどこかにあるボリュームに依存していないときに自信が増すと思う
ゴッドファーザー

53

3つの方法があります。

最初の方法

mysqlデータをホストマシンに格納するディレクトリを指定する必要があります。その後、データコンテナを削除できます。mysqlデータはローカルファイルシステムに保存されます。

Mysqlコンテナーの定義は次のようになります。

mysql:
  container_name: flask_mysql
  restart: always
  image: mysql:latest
  environment:
    MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
    MYSQL_USER: 'test'
    MYSQL_PASS: 'pass'
volumes:
 - /opt/mysql_data:/var/lib/mysql
ports:
  - "3306:3306"

二番目の方法

入力する前にデータコンテナをコミットしますdocker-compose down

docker commit my_data_container
docker-compose down

第三の方法

docker-compose stop代わりに使用することもできますdocker-compose down(そうすれば、コンテナをコミットする必要はありません)


volumes: - /var/lib/mysqlマッピングできるからといってHOST:CONTAINER、コロンを指定しないと同じディレクトリにマッピングされるのではないでしょうか?
アダム

ない。残念ながら、この場合、/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Dockerは

volumes: - /var/lib/mysql同等だと思いましたvolumes: - /var/lib/mysql:/var/lib/mysql
Adam

dockerはボリュームからイメージにデータをコミットしないため、3番目の方法は機能しません。参照github.com/moby/moby/issues/6999
Ohmen

13

mysqlデータ用に別のボリュームを作成する必要があります。

したがって、次のようになります。

volumes_from:
  - data
volumes:
  - ./mysql-data:/var/lib/mysql

そして、いいえ、/var/lib/mysqlあなたのmysqlコンテナー内のパスであり、ホストマシン上のパスとは何の関係もありません。ホストマシンにmysqlがまったくない場合もあります。したがって、目標は、mysqlコンテナーの内部フォルダーを永続化することです。


これは私を変えるの違いはなくはないでしょうvolumes、あなたの下に置くものにデータコンテナの下にvolumes単に持っていたvolumes_from: - dataためにmysql?また、これを試み、新しいエラーが発生しました。dirは存在するが書き込み不可であり、mysqlコンテナーは実行されないと言います。
アダム

もちろん、パス./mysql-data(またはセミコロンの前に置くもの)でローカルフォルダーを作成する必要があります
Dmitry Malyshenko

私の編集を参照してください。あなたがコメントする前にそれを取得しませんでした。しかし、ローカルディレクトリを作成しました。許可の問題が発生しているようです。
アダム

エラー:サービス「mysql」は「データ」からボリュームをマウントしますが、これはサービスまたはコンテナの名前ではありません。
Massimiliano Arione 2017

10

実際、これはパスであり、これが機能するための有効なパスについて言及する必要があります。あなたのデータディレクトリが、代わりに、現在のディレクトリにある場合はmy-data、あなたが言及する必要があり./my-data、それ以外の場合は、中にあなたにそのエラーを与えるだろうmysqlmariadbも。

volumes:
 ./my-data:/var/lib/mysql
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.