นักเขียน MySQL ข้อมูลถาวร


156

ฉันไม่สามารถรับข้อมูล MySQL ให้คงอยู่ได้หากฉันทำงาน$ docker-compose downกับสิ่งต่อไปนี้.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/mysqlแมปไปยังไดเรกทอรีเครื่องท้องถิ่นของฉันที่ mysql เก็บข้อมูลไปยังภาชนะและเนื่องจากการทำแผนที่นี้ข้อมูลควรจะยังคงอยู่แม้ว่าภาชนะจะถูกทำลาย และmysqlคอนเทนเนอร์เป็นเพียงส่วนต่อประสานไคลเอ็นต์เข้ากับฐานข้อมูลและสามารถดูไดเรกทอรีในเครื่องได้เนื่องจากvolumes_from: - data

ลองคำตอบนี้แล้วไม่ได้ผล ปัญหาข้อมูลถาวรของนักเทียบท่า

แก้ไข

การเปลี่ยนแปลงของฉัน.ymlที่แสดงด้านล่างและสร้างแบบ dir ./dataแต่ตอนนี้เมื่อผมทำงานเริ่มต้นภาชนะเคยชินโยนข้อผิดพลาดว่าdocker-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.

คำตอบ:


223

ที่เก็บข้อมูลเป็นวิธีแก้ไขที่ไม่จำเป็น ปริมาณข้อมูลจะทำเคล็ดลับสำหรับคุณ เปลี่ยนคุณ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:

นักเทียบท่าจะสร้างระดับเสียงให้คุณใน/var/lib/docker/volumesโฟลเดอร์ หนังสือเล่มนี้ยังคงอยู่ตราบใดที่คุณไม่ได้พิมพ์docker-compose down -v


18
เริ่มต้นด้วย MySQL 5.7.6 จะมีปัญหาการอนุญาตกับmysqlรูปภาพ Docker อีกครั้ง คุณสามารถใช้mariadbภาพนักเทียบท่าซึ่งทำงานได้อย่างไม่มีที่ติกับโวลุ่มนักเทียบท่า
Peterino

วิธีนี้ใช้ได้ผลสำหรับฉัน หมายเหตุ / ข้อกำหนดสองสามข้อด้านล่าง: 1. เมื่อคุณใช้การกำหนดค่าด้านบนใน docker-compose.yml และคุณปรับใช้สแต็กบริการของคุณโดยใช้ "docker stack stack -c docker-compose.yml mystack" ไม่จำเป็นต้องสร้าง มันจะถูกสร้างเป็น / var / lib / docker / volume / mystack_my-datavolume โดยอัตโนมัติสำหรับคุณ (โปรดสังเกตว่ามันเป็นการเติม "mystack_" ให้กับชื่อโวลุ่ม) 2. ฉันไม่จำเป็นต้องเปลี่ยนการอนุญาตในไดเรกทอรีของฉัน แม้ว่าฉันจะมีไฟล์ของ mysql: root ในคอนเทนเนอร์ของฉัน แต่มันก็สร้างขึ้นเป็น 27: root บนโฮสต์ Docker ของฉันโดยไม่มีปัญหา
Joey Cote

10
ทำไมคุณถึงต้องการเก็บไว้ในvar/lib/docker/volumesแทนที่จะมีไดเรกทอรีในโฟลเดอร์โครงการของคุณเป็นdata/mysqlอย่างไร
เจ้าพ่อ

@TheGodfather ฉันเดาว่าถ้าคุณไม่ต้องการปรับใช้ข้อมูล MySQL กับเครื่องของคุณ ไม่อย่างนั้นเป็นความคิดที่ดีมากที่ทำให้ทุกอย่างเข้าด้วยกัน
Duncan

1
@ ฉันคิดว่าเพราะฉันรู้สึกมั่นใจในตัวเองมากขึ้นเมื่อทุกส่วนของแอพและข้อมูลของฉันถูกจัดเก็บไว้ด้วยกันและฉันไม่มีการพึ่งพาปริมาณจากที่อื่น
The Godfather

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และถ้าคุณไม่ระบุ w / a โคลอนมันแมป dir เดียวกันหรือไม่
อดัม

ไม่. โชคไม่ดีในกรณีนี้นักเทียบท่าแมปไดเร็กตอรี่คอนเทนเนอร์นี้ไปยังโฟลเดอร์โฮสต์สุ่มเช่น/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Bukharov Sergey

โอเคฉันคิดว่าvolumes: - /var/lib/mysqlเทียบเท่ากับvolumes: - /var/lib/mysql:/var/lib/mysql
อดัม

วิธีที่สามของคุณจะไม่ทำงานเพราะนักเทียบท่าไม่ยอมรับข้อมูลจากปริมาณไปยังภาพ ดู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" เมานต์ไดรฟ์จาก "data" ซึ่งไม่ใช่ชื่อของบริการหรือคอนเทนเนอร์
Massimiliano Arione

10

อันที่จริงนี่คือเส้นทางและคุณควรพูดถึงเส้นทางที่ถูกต้องสำหรับการทำงาน หากไดเรกทอรีข้อมูลของคุณอยู่ในไดเรกทอรีปัจจุบันแล้วแทนการmy-dataที่คุณควรจะพูดถึง./my-dataมิฉะนั้นมันจะทำให้คุณข้อผิดพลาดที่ในmysqlและmariadbยัง

volumes:
 ./my-data:/var/lib/mysql
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.