web-dev-qa-db-ja.com

Docker-Compose永続データMySQL

次の$ docker-compose downを指定して.ymlを実行した場合、MySQLデータが持続するようには見えません。

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/mysqlを使ってそれをmysqlがコンテナにデータを保存するローカルマシンディレクトリにマッピングしているので、このマッピングのためにコンテナが破壊されてもデータは存続するはずです。そしてmysqlコンテナはデータベースへの単なるクライアントインタフェースであり、volumes_from: - dataのためにローカルディレクトリを見ることができます。

この答えを試みたがうまくいかなかった。 Dockerで構成された永続的なデータの問題

編集

以下のように.ymlを変更してdir ./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.
102
Adam

データコンテナは余分な回避策です。 データボリューム がうまくいくでしょう。 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と入力していない限り持続します。

152
Ohmen

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"

2番目の方法

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

docker commit my_data_container
docker-compose down

3番目の方法

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

34
Bukharov Sergey

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

だからそれはこのようになります:

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

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

9

実際にこれが道であり、あなたはこれが機能するための有効な道を述べるべきです。データディレクトリが現在のディレクトリにある場合はmy-dataの代わりに./my-dataを指定する必要があります。それ以外の場合はmysqlname__およびmariadbname__にもエラーが発生します。

volumes:
 ./my-data:/var/lib/mysql
2
codelearner