Tôi xin lỗi vì câu trả lời siêu dài này, nhưng, bạn có một cách nhỏ để đi đến nơi bạn muốn. Tôi sẽ nói rằng thông thường bạn sẽ không đặt bộ lưu trữ cho cơ sở dữ liệu vào cùng một bộ chứa với cơ sở dữ liệu, bạn sẽ gắn một khối lượng máy chủ để dữ liệu vẫn tồn tại trên máy chủ docker, hoặc, có lẽ một container có thể được sử dụng để giữ dữ liệu (/ var / lib / mysql). Ngoài ra, tôi chưa quen với mysql, vì vậy, điều này có thể không siêu hiệu quả. Mà nói...
Tôi nghĩ rằng có thể có một vài vấn đề ở đây. Dockerfile được sử dụng để tạo một hình ảnh. Bạn cần thực hiện bước xây dựng. Tối thiểu, từ thư mục chứa Dockerfile, bạn sẽ làm một cái gì đó như:
docker build .
Dockerfile mô tả hình ảnh để tạo. Tôi không biết nhiều về mysql (Tôi là một fanboy hậu kỳ), nhưng, tôi đã thực hiện một tìm kiếm xung quanh các interwebs để 'làm thế nào để tôi khởi tạo một container docker mysql'. Đầu tiên tôi tạo một thư mục mới để làm việc, tôi gọi nó là mdir, sau đó tôi tạo một thư mục tệp mà tôi đã gửi một tệp epcis_schema.sql tạo cơ sở dữ liệu và một bảng duy nhất:
create database test;
use test;
CREATE TABLE testtab
(
id INTEGER AUTO_INCREMENT,
name TEXT,
PRIMARY KEY (id)
) COMMENT='this is my test table';
Sau đó, tôi đã tạo một tập lệnh có tên init_db trong thư mục tập tin:
#!/bin/bash
# Initialize MySQL database.
# ADD this file into the container via Dockerfile.
# Assuming you specify a VOLUME ["/var/lib/mysql"] or `-v /var/lib/mysql` on the `docker run` command…
# Once built, do e.g. `docker run your_image /path/to/docker-mysql-initialize.sh`
# Again, make sure MySQL is persisting data outside the container for this to have any effect.
set -e
set -x
mysql_install_db
# Start the MySQL daemon in the background.
/usr/sbin/mysqld &
mysql_pid=$!
until mysqladmin ping >/dev/null 2>&1; do
echo -n "."; sleep 0.2
done
# Permit root login without password from outside container.
mysql -e "GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '' WITH GRANT OPTION"
# create the default database from the ADDed file.
mysql < /tmp/epcis_schema.sql
# Tell the MySQL daemon to shutdown.
mysqladmin shutdown
# Wait for the MySQL daemon to exit.
wait $mysql_pid
# create a tar file with the database as it currently exists
tar czvf default_mysql.tar.gz /var/lib/mysql
# the tarfile contains the initialized state of the database.
# when the container is started, if the database is empty (/var/lib/mysql)
# then it is unpacked from default_mysql.tar.gz from
# the ENTRYPOINT /tmp/run_db script
(hầu hết các tập lệnh này đã được gỡ bỏ từ đây: https://gist.github.com/pda/9697520 )
Đây là tập tin / run_db script mà tôi đã tạo:
# start db
set -e
set -x
# first, if the /var/lib/mysql directory is empty, unpack it from our predefined db
[ "$(ls -A /var/lib/mysql)" ] && echo "Running with existing database in /var/lib/mysql" || ( echo 'Populate initial db'; tar xpzvf default_mysql.tar.gz )
/usr/sbin/mysqld
Cuối cùng, Dockerfile để ràng buộc tất cả:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
ADD files/run_db files/init_db files/epcis_schema.sql /tmp/
# init_db will create the default
# database from epcis_schema.sql, then
# stop mysqld, and finally copy the /var/lib/mysql directory
# to default_mysql_db.tar.gz
RUN /tmp/init_db
# run_db starts mysqld, but first it checks
# to see if the /var/lib/mysql directory is empty, if
# it is it is seeded with default_mysql_db.tar.gz before
# the mysql is fired up
ENTRYPOINT "/tmp/run_db"
Vì vậy, tôi đã gửi thư mục mdir của mình (có Dockerfile cùng với thư mục tệp). Sau đó tôi chạy lệnh:
docker build --no-cache .
Bạn sẽ thấy đầu ra như thế này:
Sending build context to Docker daemon 7.168 kB
Sending build context to Docker daemon
Step 0 : FROM mysql
---> 461d07d927e6
Step 1 : MAINTAINER (me) <email>
---> Running in 963e8de55299
---> 2fd67c825c34
Removing intermediate container 963e8de55299
Step 2 : ADD files/run_db files/init_db files/epcis_schema.sql /tmp/
---> 81871189374b
Removing intermediate container 3221afd8695a
Step 3 : RUN /tmp/init_db
---> Running in 8dbdf74b2a79
+ mysql_install_db
2015-03-19 16:40:39 12 [Note] InnoDB: Using atomics to ref count buffer pool pages
...
/var/lib/mysql/ib_logfile0
---> 885ec2f1a7d5
Removing intermediate container 8dbdf74b2a79
Step 4 : ENTRYPOINT "/tmp/run_db"
---> Running in 717ed52ba665
---> 7f6d5215fe8d
Removing intermediate container 717ed52ba665
Successfully built 7f6d5215fe8d
Bây giờ bạn có một hình ảnh '7f6d5215fe8d'. Tôi có thể chạy hình ảnh này:
docker run -d 7f6d5215fe8d
và hình ảnh bắt đầu, tôi thấy một chuỗi ví dụ:
4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3
Sau đó tôi có thể 'dừng lại' và khởi động lại nó.
docker stop 4b377
docker start 4b377
Nếu bạn nhìn vào nhật ký, dòng đầu tiên sẽ chứa:
docker logs 4b377
Populate initial db
var/lib/mysql/
...
Sau đó, ở phần cuối của bản ghi:
Running with existing database in /var/lib/mysql
Đây là các thông báo từ tập lệnh / tmp / run_db, thông báo đầu tiên cho biết cơ sở dữ liệu đã được giải nén từ phiên bản đã lưu (ban đầu), cơ sở thứ hai chỉ ra rằng cơ sở dữ liệu đã có sẵn, vì vậy bản sao hiện có đã được sử dụng.
Đây là một ls -lR của cấu trúc thư mục tôi mô tả ở trên. Lưu ý rằng init_db và run_db là các tập lệnh với tập bit thực thi:
gregs-air:~ gfausak$ ls -Rl mdir
total 8
-rw-r--r-- 1 gfausak wheel 534 Mar 19 11:13 Dockerfile
drwxr-xr-x 5 gfausak staff 170 Mar 19 11:24 files
mdir/files:
total 24
-rw-r--r-- 1 gfausak staff 126 Mar 19 11:14 epcis_schema.sql
-rwxr-xr-x 1 gfausak staff 1226 Mar 19 11:16 init_db
-rwxr-xr-x 1 gfausak staff 284 Mar 19 11:23 run_db