2014-12-19 18 views
6

Tôi đang cố gắng tạo vùng chứa MySQL Docker được đặt trước với một lược đồ và dữ liệu hạt giống nhất định để tôi có thể có các vùng chứa khác kết nối với nó dưới dạng db. Tôi đang sử dụng trusted dockerfile/mysql image làm cơ sở, và tôi đã viết một Dockerfile để tạo một hình ảnh mới từ cơ sở đó và thêm schema.sql của tôi vào đó. Sau khi xây dựng hình ảnh đó (mysql: base), tôi đã cố gắng chạy bash trong thùng chứa mới, sau đó đi vào mysql và tạo cơ sở dữ liệu của tôi và sau đó nhập giản đồ. Sau đó, tôi thoát khỏi vùng chứa và cố gắng chuyển vùng chứa đó sang một hình ảnh Docker mới. Tuy nhiên, hình ảnh kết quả không tồn tại bất kỳ thay đổi nào tôi đã thực hiện đối với db của MySQL. Nó tồn tại các tệp khác mà tôi đã viết trong vùng chứa, chứ không phải db.Vùng chứa Docker MySQL không lưu dữ liệu vào hình ảnh mới

Đây là Dockerfile tôi sử dụng để xây dựng hình ảnh ban đầu (myorg/mysql: base).

FROM dockerfile/mysql:latest 
MAINTAINER (me) 

ADD schema.sql /data/schema.sql 

EXPOSE 3306 

# Define working directory. 
WORKDIR /data 

CMD ["mysqld_safe"] 

Sau khi xây dựng đó, tôi đi vào hình ảnh:

docker run -i -t myorg/mysql:base bash 

Và chạy MySQL nhập các lược đồ:

myslqd_safe & 
141218 00:15:56 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 

mysql -u root 

mysql> CREATE DATABASE mydb; 
exit; 

mysql -u root -D mydb < schema.sql 

tôi có thể đi vào mysql và xác minh các lược đồ đã được đã nhập thành công:

mysql -u root -D mydb -e "SELECT * from tokens;" 

Ngoài ra, nếu tôi đi vào /var/lib/mysql Tôi có thể thấy rằng có một thư mục mydb có chứa các tệp .frm tương ứng với db.

Nhưng khi tôi thoát ra và cố gắng cam kết container đến một hình ảnh mới:

docker commit -m="import schema.sql" -a="Me" 72c2ff39dd65 myorg/mysql:seed 

Và sau đó đi vào hình ảnh mới:

docker run -i -t --rm myorg/mysql:seed bash 

Các file db không còn trong/var/lib/mysql và chạy mysql -u root -e "SHOW DATABASES" không hiển thị cơ sở dữ liệu mydb, chỉ mặc định mysql, information_schemaperformance_schema dbs. Tôi thấy rằng nếu tôi đã tạo một tệp văn bản mới trong vùng chứa (echo 'test' > newfile), tệp đó sẽ có mặt trong hình ảnh đã cam kết, chứ không phải tệp db.

Tôi tự hỏi liệu điều này có liên quan gì đến thực tế là hình ảnh đáng tin cậy Dockerfile có VOLUME ["/etc/mysql", "/var/lib/mysql"] để nó gắn kết thư mục db dưới dạng ổ đĩa. Dockerfile của tôi không có lệnh này, nhưng tôi không biết nếu nó được thừa hưởng anyway (Tôi không thực sự hiểu làm thế nào khối lượng hoạt động tốt, đủ để biết làm thế nào điều này có thể ảnh hưởng đến xây dựng của tôi). Tôi không cần db gắn kết như một khối lượng vì tôi cần một container để kết nối với nó qua một kết nối mạng (tôi sẽ sử dụng liên kết docker cho rằng).

FWIW, tôi đang chạy boot2docker 1.3.2 trên OS X 10.9.5.

+0

Thùng chứa MYSQL chính thức FYI ở đây https://registry.hub.docker.com/_/mysql/ không phải là tài khoản bạn đã liên kết –

Trả lời

1

Có lẽ bạn nên tắt mysql của riêng mình. Bằng cách đó không có bất ngờ, không có "ma thuật" ẩn giấu trong đó.

Nếu bạn xem ví dụ dockerfile cho lõi mysql, bạn có thể thấy khai báo VOLUME cho/var/lib/mysql.

Docs on docker volumes.

khối lượng dữ liệu

Một khối lượng dữ liệu là một thư mục đặc biệt-chỉ định trong một hoặc nhiều container không cần qua giai Liên File System để cung cấp một số tính năng hữu ích cho dữ liệu liên tục hoặc chia sẻ:

  • Khối lượng dữ liệu có thể được chia sẻ và sử dụng lại giữa các vùng chứa
  • Thay đổi thành volum dữ liệu e được thực hiện trực tiếp
  • Thay đổi một khối lượng dữ liệu sẽ không được đưa vào khi bạn cập nhật một hình ảnh
  • Volumes kiên trì cho đến khi không container sử dụng chúng
+0

Tôi đoán câu trả lời tại sao nó không được lưu. Ban đầu tôi đã cố gắng cuộn vùng chứa mysql của riêng mình nhưng thấy quá khó để thiết lập và định cấu hình đúng cách. Có một hình ảnh dựng sẵn nào khác có thể phù hợp hơn với mục đích của tôi không? –

+2

Plus 1 để xác định sự cố nhưng trừ 1 cho "Cuộn của riêng bạn". Bạn không cần phải lặp lại công việc đã được thực hiện. –

+0

Có lẽ không cần, nhưng ít nhất bạn sở hữu nó/hiểu nó. – user2105103

5

Như câu trả lời khác và bạn đã tuyên bố khối lượng không thể cam kết và các thùng chứa con thực tế thừa hưởng các định nghĩa về khối lượng từ cha mẹ. Do đó, bất kỳ thay đổi nào về khối lượng sẽ bị loại bỏ. Tôi muốn thêm dữ liệu như tập tin cơ sở dữ liệu mysql phải luôn luôn được trong khối lượng vì nhiều lý do và bạn không nên cố gắng để cam kết nó vào hình ảnh của bạn.

  1. Nếu bạn phải di chuyển vùng chứa, không có cách nào dễ dàng để trích xuất dữ liệu từ vùng chứa nếu không có khối lượng.
  2. Nếu bạn muốn bắt đầu nhiều vùng chứa chia sẻ dữ liệu, bạn phải có dữ liệu trong một ổ đĩa.
  3. Nếu bạn muốn thay đổi định nghĩa vùng chứa của mình bằng cách cho biết số lượng hoặc cổng mới bạn phải xóa và tạo lại. Nếu bạn có dữ liệu trong thùng chứa, bạn sẽ mất nó. (Xem this question để biết ví dụ về trường hợp này.)
  4. Hệ thống tệp công đoàn chậm hơn hệ thống tệp thông thường sẽ làm chậm ứng dụng hoặc cơ sở dữ liệu của bạn.

Vậy bạn nên làm gì thay thế?

  1. Sử dụng vùng chứa chỉ dữ liệu có thể được liên kết với bất kỳ trường hợp nào của vùng chứa dịch vụ. Sau đó, bạn có thể sử dụng khối lượng từ để đưa dữ liệu của bạn vào vùng chứa dịch vụ.
  2. Sử dụng khối lượng được gắn trên máy chủ để bạn có thể khởi động lại vùng chứa và gắn cùng một vị trí vào vùng chứa mới.
+0

Tôi cung cấp cho bạn +1 đặc biệt vì lý do 4 thường bị bỏ qua. Không bao giờ đặt dữ liệu trong hệ thống tập tin Union – Thomasleveil

+0

Rõ ràng với Docker 1.9.0 và api khối lượng mới (https://docs.docker.com/engine/reference/commandline/volume_create/) không cần sử dụng các thùng chứa dữ liệu nữa. Bạn có biết điều này có thể áp dụng cho câu hỏi này không? – lloiacono

Các vấn đề liên quan