Je suis désolé pour cette réponse très longue, mais vous avez un petit chemin à parcourir pour arriver là où vous le souhaitez. Je dirai que normalement, vous ne mettriez pas le stockage de la base de données dans le même conteneur que la base de données elle-même, vous monteriez soit un volume hôte afin que les données persistent sur l'hôte docker, soit un conteneur pourrait peut-être être utilisé pour contenir les données (/ var / lib / mysql). De plus, je suis nouveau sur mysql, donc ce n'est peut-être pas très efficace. Cela dit...
Je pense qu'il y a peut-être quelques problèmes ici. Le Dockerfile est utilisé pour créer une image. Vous devez exécuter l'étape de construction. Au minimum, à partir du répertoire qui contient le Dockerfile, vous feriez quelque chose comme:
docker build .
Le Dockerfile décrit l'image à créer. Je ne sais pas grand-chose sur mysql (je suis un fanboy postgres), mais j'ai fait une recherche autour des interwebs pour savoir «comment initialiser un conteneur de docker mysql». J'ai d'abord créé un nouveau répertoire dans lequel travailler, je l'ai appelé mdir, puis j'ai créé un répertoire de fichiers dans lequel j'ai déposé un fichier epcis_schema.sql qui crée une base de données et une seule table:
create database test;
use test;
CREATE TABLE testtab
(
id INTEGER AUTO_INCREMENT,
name TEXT,
PRIMARY KEY (id)
) COMMENT='this is my test table';
Ensuite, j'ai créé un script appelé init_db dans le répertoire des fichiers:
#!/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
(la plupart de ce script a été levé d'ici: https://gist.github.com/pda/9697520 )
Voici le script files / run_db que j'ai créé:
# 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
Enfin, le Dockerfile pour les lier tous:
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"
Donc, je suis entré dans mon répertoire mdir (qui contient le Dockerfile avec le répertoire des fichiers). J'exécute ensuite la commande:
docker build --no-cache .
Vous devriez voir une sortie comme celle-ci:
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
Vous avez maintenant une image '7f6d5215fe8d'. Je pourrais exécuter cette image:
docker run -d 7f6d5215fe8d
et l'image commence, je vois une chaîne d'instance:
4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3
Je pourrais alors «l'arrêter» et le redémarrer.
docker stop 4b377
docker start 4b377
Si vous regardez les journaux, la première ligne contiendra:
docker logs 4b377
Populate initial db
var/lib/mysql/
...
Puis, à la fin des logs:
Running with existing database in /var/lib/mysql
Ce sont les messages du script / tmp / run_db, le premier indique que la base de données a été décompressée à partir de la version enregistrée (initiale), le second indique que la base de données était déjà là, donc la copie existante a été utilisée.
Voici un ls -lR de la structure de répertoires que je décris ci-dessus. Notez que init_db et run_db sont des scripts avec le bit d'exécution défini:
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