Docker-menulis data persisten MySQL

156

Saya sepertinya tidak bisa mendapatkan data MySQL untuk bertahan jika saya menjalankan $ docker-compose downyang berikut ini.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"

Pemahaman saya adalah bahwa dalam datawadah saya menggunakan volumes: - /var/lib/mysqlpeta ke direktori mesin lokal saya di mana mysql menyimpan data ke wadah dan karena pemetaan ini data harus bertahan bahkan jika kontainer dihancurkan. Dan mysqlwadah hanyalah antarmuka klien ke db dan dapat melihat direktori lokal karenavolumes_from: - data

Mencoba jawaban ini dan tidak berhasil. Docker-Compose Data Persistent Trouble

EDIT

Berubah saya .ymlseperti yang ditunjukkan di bawah ini dan menciptakan dir ./datatapi sekarang ketika saya menjalankan docker-compose up --builddengan mysqlwadah wont start melempar kesalahan mengatakan

  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.
Adam
sumber

Jawaban:

222

Wadah data adalah solusi yang tidak perlu. Volume data akan melakukan trik untuk Anda. Ubah docker-compose.ymlke:

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 akan membuat volume untuk Anda di /var/lib/docker/volumesfolder. Volume ini tetap ada selama Anda tidak mengetikdocker-compose down -v

Ohmen
sumber
18
Dimulai dengan MySQL 5.7.6 akan ada (lagi) masalah izin dengan mysqlgambar Docker. Anda bisa menggunakan mariadbgambar Docker, yang berfungsi dengan sempurna dengan volume Docker.
Peterino
Solusi ini berhasil untuk saya. Beberapa catatan / tindakan tambahan: 1. ketika Anda menggunakan konfigurasi di atas di docker-compose.yml dan Anda menggunakan tumpukan layanan Anda menggunakan "docker stack deploy -c docker-compose.yml mystack", tidak perlu membuat volume secara manual, itu akan dibuat sebagai / var / lib / docker / volume / mystack_my-datavolume secara otomatis untuk Anda (perhatikan bahwa ia menambahkan "mystack_" ke nama volume). 2. Saya tidak perlu mengubah izin pada direktori saya. Bahkan jika saya memiliki file yang dimiliki oleh mysql: root di wadah saya, mereka dibuat sebagai 27: root pada host Docker saya tanpa masalah.
Joey Cote
10
Mengapa Anda ingin menyimpannya var/lib/docker/volumesdaripada memiliki direktori di folder proyek Anda data/mysql?
The Godfather
@TheGodfather Dugaan saya adalah jika Anda tidak ingin menggunakan data MySQL ke mesin produksi Anda; jika tidak, itu ide yang sangat bagus untuk menyatukan semuanya.
Duncan
1
@louhow saya berpikir karena saya merasa lebih percaya diri ketika semua bagian dari aplikasi dan data saya disimpan bersama-sama, dan saya tidak memiliki ketergantungan pada beberapa volume dari suatu tempat
The Godfather
53

Ada 3 cara:

Cara pertama

Anda perlu menentukan direktori untuk menyimpan data mysql di mesin host Anda . Anda kemudian dapat menghapus wadah data. Data mysql Anda akan disimpan di sistem file lokal Anda.

Definisi wadah Mysql harus seperti ini:

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"

Cara kedua

Akan melakukan wadah data sebelum mengetik docker-compose down:

docker commit my_data_container
docker-compose down

Cara ketiga

Anda juga dapat menggunakan docker-compose stopbukan docker-compose down(maka Anda tidak perlu melakukan wadah)

Bukharov Sergey
sumber
Tidak bisakah saya memilikinya volumes: - /var/lib/mysqlkarena memetakan HOST:CONTAINERdan jika Anda tidak menentukan w / a colon itu memetakan dir yang sama?
Adam
Tidak. sayangnya dalam hal ini buruh pelabuhan memetakan direktori wadah ini ke folder host acak seperti/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Bukharov Sergey
Oke saya pikir volumes: - /var/lib/mysqlitu setara denganvolumes: - /var/lib/mysql:/var/lib/mysql
Adam
cara ketiga Anda tidak akan berhasil karena buruh pelabuhan tidak melakukan data dari volume ke gambar. lihat github.com/moby/moby/issues/6999
Ohmen
13

Anda harus membuat volume terpisah untuk data mysql.

Jadi akan terlihat seperti ini:

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

Dan tidak, /var/lib/mysqlada jalur di dalam wadah mysql Anda dan tidak ada hubungannya dengan jalur di mesin host Anda. Mesin host Anda bahkan mungkin tidak memiliki mysql sama sekali. Jadi tujuannya adalah untuk mempertahankan folder internal dari wadah mysql.

Dmitry Malyshenko
sumber
Bukankah ini tidak ada bedanya dengan mengubah volumesdata saya di bawah wadah data menjadi apa yang Anda masukkan ke bawah volumesdan hanya volumes_from: - datauntuk Anda mysql? Juga mencoba ini dan menghasilkan kesalahan baru. Dikatakan ada dir tetapi tidak bisa ditulisi dan mysqlwadah tidak akan berjalan.
Adam
Tentu saja Anda harus membuat folder lokal dengan path ./mysql-data (atau apa pun yang akan Anda masukkan sebelum titik koma)
Dmitry Malyshenko
Lihat hasil edit saya. Tidak mengerti sebelum Anda berkomentar. Tapi apakah membuat dir lokal. Sepertinya ada masalah izin sekarang.
Adam
GALAT: Layanan "mysql" me-mount volume dari "data", yang bukan nama layanan atau wadah.
Massimiliano Arione
10

Sebenarnya ini adalah jalan dan Anda harus menyebutkan jalan yang valid agar ini berfungsi. Jika direktori data Anda berada di direktori saat ini maka alih-alih my-dataAnda harus menyebutkan ./my-data, jika tidak maka akan memberikan Anda kesalahan itu mysqldan mariadbjuga.

volumes:
 ./my-data:/var/lib/mysql
pembuat kode
sumber