Docker-Compose kalıcı verileri MySQL


156

$ docker-compose downAşağıdakilerle çalışırsam MySQL verilerinin kalıcı olmasını sağlayamıyorum.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"

Anladığım kadarıyla benim datakapsayıcıda volumes: - /var/lib/mysqlmysql'in kapsayıcıya veri depoladığı yerel makineler dizinime eşler ve bu eşleme nedeniyle kaplar yok olsa bile verilerin devam etmesi gerektiğidir. Ve mysqlkapsayıcı db içine sadece bir istemci arayüzü ve nedeniyle yerel dizini görebilirsinizvolumes_from: - data

Bu yanıtı denedi ve işe yaramadı. Docker-Compose Kalıcı Veri Sorunu

DÜZENLE

Gözlerimi Değişti .ymlaşağıda gösterilen ve bir dir yaratılan olarak ./dataama şimdi çalıştırdığınızda konteyner alışkanlık başlangıç söyleyerek hata atardocker-compose up --buildmysql

  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.

Yanıtlar:


223

Veri kabı gereksiz bir çözümdür. Veri hacimleri işinizi görecektir. Şunu docker-compose.ymldeğiştirin:

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/volumesklasörde sizin için birimi oluşturacaktır . Bu birim, yazmadığınız sürece devam ederdocker-compose down -v


18
MySQL 5.7.6 ile başlayarak (tekrar) Docker görüntüsü ile ilgili izin sorunları olacaktır mysql. Bunun yerine Docker birimlerinde kusursuz çalışanmariadb Docker görüntüsünü kullanabilirsiniz .
Peterino

Bu çözüm benim için çalıştı. Birkaç yan not / kesinlik: 1. docker-compose.yml dosyasında yukarıdaki yapılandırmayı kullandığınızda ve "docker stack deploy -c docker-compose.yml mystack" komutunu kullanarak hizmet yığınınızı dağıttığınızda, birim manuel olarak sizin için otomatik olarak / var / lib / docker / volumes / mystack_my-datavolume olarak oluşturulur (birim adına "mystack_" eklediğine dikkat edin). 2. Dizindeki izinleri değiştirmek zorunda kalmadım. Kapsayıcımda mysql: root'a ait dosyalar olsa bile, Docker sunucumda sorunsuz 27: root olarak oluşturuldu.
Joey Cote

10
Neden var/lib/docker/volumesproje klasörünüzdeki gibi dizin yerine saklamak istediniz data/mysql?
babası

@ TheGodfather Sanırım MySQL verilerini üretim makinenize dağıtmak istemezseniz; aksi halde, her şeyi bir arada tutmak çok sağlam bir fikirdir.
Duncan

1
@louhow ne zaman kendimi daha güvende hissediyorum çünkü bence hepsi benim app ve verilerin parçaları bir araya nasılsa depolanır ve ben yere gelen bazı hacme hiçbir bağımlılıkları var
Godfather

53

3 yol vardır:

İlk yol

Ana makinenizde mysql verilerini saklamak için dizini belirtmeniz gerekir . Daha sonra veri taşıyıcısını kaldırabilirsiniz. MySQL verileriniz yerel dosya sisteminize kaydedilir.

Mysql kap tanımı şu şekilde olmalıdır:

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"

İkinci yol

Yazmadan önce veri kapsayıcısını yürütmek olurdu docker-compose down:

docker commit my_data_container
docker-compose down

Üçüncü yol

Ayrıca docker-compose stopyerine kullanabilirsiniz docker-compose down(o zaman konteyner taahhüt etmek gerekmez)


Ben sadece volumes: - /var/lib/mysqlharita çünkü sahip olamaz HOST:CONTAINERve iki nokta üst üste w / belirtmezseniz aynı dir eşler?
Adam

Değil. ne yazık ki bu durumda liman işçisi bu konteyner dizinini rastgele ana bilgisayar klasörüyle /var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
eşleştiriyor

Tamam ben düşünce volumes: - /var/lib/mysqleşdeğer olduvolumes: - /var/lib/mysql:/var/lib/mysql
Adam

docker, birimlerden görüntüye veri aktarmadığı için üçlü yolunuz çalışmaz. bkz. github.com/moby/moby/issues/6999
Ohmen

13

MySQL verileri için ayrı bir birim oluşturmanız gerekir.

Yani şöyle görünecek:

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

Ve hayır, /var/lib/mysqlmysql konteynerinizin içindeki bir yoldur ve ana makinenizdeki bir yolla ilgisi yoktur. Ana makinenizde hiç mysql bile olmayabilir. Bu nedenle amaç mysql kapsayıcısından dahili bir klasör oluşturmaktır.


Bu benim değişen farksız olmaz volumesaşağıdaki konularda altına ne veri konteyner altında volumesve sadece vardı volumes_from: - dataiçin mysql? Ayrıca bunu denedi ve yeni bir hata. Dir olduğunu söyler ama yazılamaz vemysql konteyner çalışmaz .
Adam

Tabii ki bir yol ./mysql-data ile yerel bir klasör oluşturmak zorunda (veya noktalı virgül önce koyardı neyse)
Dmitry Malyshenko

Düzenlememe bakın. Yorum yapmadan önce içeri alamadım. Ancak yerel dir. Görünüşe göre şimdi bir izin sorunu var.
Adam

HATA: Hizmet "mysql", bir hizmet veya kapsayıcı adı olmayan "veri" den birimler bağlar.
Massimiliano Arione

10

Aslında bu yol ve bunun çalışması için geçerli bir yol belirtmelisiniz. Veri dizininiz geçerli dizinde ise, bunun yerine my-databelirtmeniz gerekir ./my-data, aksi takdirde size bu hatayı mysqlve mariadbde verir.

volumes:
 ./my-data:/var/lib/mysql
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.