Saya minta maaf atas jawaban super panjang ini, tetapi, Anda memiliki sedikit cara untuk pergi ke tempat yang Anda inginkan. Saya akan mengatakan bahwa biasanya Anda tidak akan menempatkan penyimpanan untuk database dalam wadah yang sama dengan database itu sendiri, Anda akan me-mount volume host sehingga data tetap ada pada host buruh pelabuhan, atau, mungkin sebuah wadah dapat digunakan untuk tahan data (/ var / lib / mysql). Juga, saya baru di mysql, jadi, ini mungkin tidak super efisien. Yang mengatakan ...
Saya pikir mungkin ada beberapa masalah di sini. Dockerfile digunakan untuk membuat gambar. Anda perlu menjalankan langkah pembangunan. Minimal, dari direktori yang berisi Dockerfile Anda akan melakukan sesuatu seperti:
docker build .
Dockerfile menjelaskan gambar yang akan dibuat. Saya tidak tahu banyak tentang mysql (saya seorang fanboy postgres), tetapi, saya melakukan pencarian di sekitar jalinan untuk 'bagaimana saya menginisialisasi wadah buruh pelabuhan mysql'. Pertama saya membuat direktori baru untuk bekerja, saya menyebutnya mdir, lalu saya membuat direktori file yang saya simpan file epcis_schema.sql yang membuat database dan satu tabel:
create database test;
use test;
CREATE TABLE testtab
(
id INTEGER AUTO_INCREMENT,
name TEXT,
PRIMARY KEY (id)
) COMMENT='this is my test table';
Kemudian saya membuat skrip bernama init_db di direktori file:
#!/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
(sebagian besar skrip ini diangkat dari sini: https://gist.github.com/pda/9697520 )
Berikut ini skrip file / run_db yang saya buat:
# 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
Akhirnya, Dockerfile mengikat semuanya:
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"
Jadi, saya pindah ke direktori mdir saya (yang memiliki Dockerfile bersama dengan direktori file). Saya kemudian menjalankan perintah:
docker build --no-cache .
Anda akan melihat output seperti ini:
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
Anda sekarang memiliki gambar '7f6d5215fe8d'. Saya dapat menjalankan gambar ini:
docker run -d 7f6d5215fe8d
dan gambar dimulai, saya melihat string contoh:
4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3
Saya kemudian bisa 'menghentikannya', dan memulai kembali.
docker stop 4b377
docker start 4b377
Jika Anda melihat log, baris pertama akan berisi:
docker logs 4b377
Populate initial db
var/lib/mysql/
...
Kemudian, di akhir log:
Running with existing database in /var/lib/mysql
Ini adalah pesan-pesan dari skrip / tmp / run_db, yang pertama menunjukkan bahwa basis data dibongkar dari versi yang disimpan (awal), yang kedua menunjukkan bahwa basis data sudah ada di sana, sehingga salinan yang ada digunakan.
Berikut ini adalah ls-lR dari struktur direktori yang saya jelaskan di atas. Perhatikan bahwa init_db dan run_db adalah skrip dengan set bit eksekusi:
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