Docker-Soạn dữ liệu liên tục MySQL


156

Tôi dường như không thể có được dữ liệu MySQL để duy trì nếu tôi chạy $ docker-compose downvới những điều sau đây.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"

Sự hiểu biết của tôi là trong datacontainer của tôi sử dụng volumes: - /var/lib/mysqlánh xạ tới thư mục máy cục bộ của tôi, nơi mysql lưu trữ dữ liệu vào container và do ánh xạ này, dữ liệu sẽ tồn tại ngay cả khi các container bị phá hủy. Và mysqlcontainer chỉ là một giao diện máy khách vào db và có thể thấy thư mục cục bộ vìvolumes_from: - data

Đã thử câu trả lời này và nó không hoạt động. Docker-Compose Rắc rối dữ liệu liên tục

BIÊN TẬP

Thay đổi của tôi .ymlnhư hình dưới đây và tạo ra một thư mục ./datanhưng bây giờ khi tôi chạy docker-compose up --buildcác mysqlđầu sẽ không chứa ném lỗi nói

  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.

Câu trả lời:


221

Các thùng chứa dữ liệu là một cách giải quyết không cần thiết. Khối lượng dữ liệu sẽ làm thủ thuật cho bạn. Thay đổi của bạn 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 sẽ tạo âm lượng cho bạn trong /var/lib/docker/volumesthư mục. Âm lượng này vẫn tồn tại miễn là bạn không gõdocker-compose down -v


18
Bắt đầu với MySQL 5.7.6 sẽ có (một lần nữa) các vấn đề về quyền với mysqlhình ảnh Docker. Thay vào đó, bạn có thể sử dụng mariadbhình ảnh Docker, hoạt động hoàn hảo với khối lượng Docker.
Peterino

Giải pháp này đã làm việc cho tôi. Một vài lưu ý bên lề: 1. khi bạn sử dụng cấu hình trên trong docker-compose.yml và bạn triển khai ngăn xếp dịch vụ của mình bằng cách sử dụng "docker stack triển khai -c docker-compose.yml mystack", không cần phải tạo âm lượng theo cách thủ công, nó sẽ được tạo tự động dưới dạng / var / lib / docker / volume / mystack_my-datavolume cho bạn (lưu ý rằng nó đặt "mystack_" cho tên âm lượng). 2. Tôi không phải thay đổi quyền trên thư mục của mình. Ngay cả khi tôi có các tệp thuộc sở hữu của mysql: root trong container của mình, chúng vẫn được tạo là 27: root trên máy chủ Docker của tôi mà không gặp vấn đề gì.
Joey Côte

10
Tại sao bạn muốn lưu trữ nó var/lib/docker/volumesthay vì có thư mục trong thư mục dự án của bạn như thế data/mysqlnào?
Bố già

@TheGod lương Dự đoán của tôi sẽ là nếu bạn không muốn triển khai dữ liệu MySQL vào máy sản xuất của mình; mặt khác, đó là một ý tưởng rất hợp lý giữ mọi thứ lại với nhau.
Duncan

1
@louhow Tôi nghĩ bởi vì tôi cảm thấy tự tin hơn khi tất cả các phần của ứng dụng và dữ liệu của tôi được lưu trữ bằng cách nào đó và tôi không phụ thuộc vào một số lượng từ đâu đó
Bố già

53

Có 3 cách:

Cách thứ nhất

Bạn cần chỉ định thư mục để lưu trữ dữ liệu mysql trên máy chủ của bạn . Sau đó bạn có thể loại bỏ các thùng chứa dữ liệu. Dữ liệu mysql của bạn sẽ được lưu trên hệ thống tệp cục bộ của bạn.

Định nghĩa container Mysql phải như thế này:

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"

Cách thứ hai

Sẽ cam kết chứa dữ liệu trước khi gõ docker-compose down:

docker commit my_data_container
docker-compose down

Cách thứ ba

Ngoài ra, bạn có thể sử dụng docker-compose stopthay vì docker-compose down(sau đó bạn không cần phải cam kết container)


Tôi không thể có volumes: - /var/lib/mysqlvì nó ánh xạ HOST:CONTAINERvà nếu bạn không chỉ định w / dấu hai chấm thì nó ánh xạ cùng một thư mục?
Adam

Không phải. Thật không may trong trường hợp này docker ánh xạ thư mục container này vào thư mục máy chủ ngẫu nhiên như/var/lib/docker/volumes/ec3c543bc92f114c2c568733541e89381881e5a62996d7084e07793f86280535
Bukharov Sergey

Được rồi tôi nghĩ volumes: - /var/lib/mysqllà tương đương vớivolumes: - /var/lib/mysql:/var/lib/mysql
Adam

cách thrid của bạn sẽ không hoạt động vì docker không cam kết dữ liệu từ khối lượng đến hình ảnh. xem github.com/moby/moby/issues/6999
Ohmen

13

Bạn phải tạo một khối lượng riêng cho dữ liệu mysql.

Vì vậy, nó sẽ trông như thế này:

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

Và không, /var/lib/mysqllà một đường dẫn bên trong thùng chứa mysql của bạn và không liên quan gì đến một đường dẫn trên máy chủ của bạn. Máy chủ của bạn thậm chí có thể không có mysql. Vì vậy, mục tiêu là duy trì một thư mục nội bộ từ một thùng chứa mysql.


Sẽ không này không có khác biệt so với thay đổi của tôi volumesdưới sự chứa dữ liệu với những gì bạn đặt dưới của bạn volumesvà chỉ cần có volumes_from: - datacho mysql? Cũng đã thử điều này và một lỗi mới. Nói dir tồn tại nhưng không thể ghi và mysqlcontainer sẽ không chạy.
Adam

Tất nhiên bạn phải tạo một thư mục địa phương với một ./mysql-data đường dẫn (hoặc bất cứ điều gì bạn sẽ đặt trước dấu chấm phẩy)
Dmitry Malyshenko

Xem chỉnh sửa của tôi. Không nhận được nó trước khi bạn nhận xét. Nhưng đã tạo ra dir địa phương. Hình như có một vấn đề cho phép bây giờ.
Adam

LRI: Dịch vụ "mysql" gắn kết khối lượng từ "dữ liệu", không phải là tên của dịch vụ hoặc vùng chứa.
Massimiliano Arione

10

Trên thực tế đây là đường dẫn và bạn nên đề cập đến một đường dẫn hợp lệ để làm việc này. Nếu thư mục dữ liệu của bạn nằm trong thư mục hiện tại thì thay vì my-databạn nên đề cập ./my-data, nếu không nó sẽ cung cấp cho bạn lỗi đó mysqlmariadbcả.

volumes:
 ./my-data:/var/lib/mysql
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.