How can I initialize a MySQL database with schema in a Docker container?
我正在尝试用MySQL数据库创建一个容器,并向这些数据库添加一个模式。
我当前的dockerfile是:
1 2 3 4 5 6 7 8 9 10 |
为了创建容器,我遵循Docker上提供的文档并执行此命令:
1 | docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb |
但是,当我执行这个命令时,容器没有被创建,并且处于容器状态,可以看到命令没有成功执行,实际上只有
不管怎样,有没有用模式初始化数据库的方法,或者我需要手动执行这些操作?
我有一个相同的问题,我想初始化我的mysql docker实例的模式,但在做了一些谷歌搜索和跟踪其他实例之后,我遇到了困难。我就是这样解决的。
1)将你的mysql模式转储到一个文件中。
2)使用add命令将您的模式文件添加到docker容器中的
Dockerfile:
1 2 3 4 5 6 7 8 9 10 |
3)启动Docker MySQL实例。
1 2 | docker-compose build docker-compose up |
感谢您在dockerfile中设置mysql并导入dump,以便将我包含在docker-entrypoint.sh中,而且它同时运行SQL和shell脚本!
我为这个超长的答案感到抱歉,但是,你有一个小办法去你想要的地方。我要说的是,通常情况下,您不会将数据库的存储放在与数据库本身相同的容器中,您要么装载一个主机卷,以便数据在Docker主机上保持不变,要么使用一个容器来保存数据(/var/lib/mysql)。另外,我是MySQL的新手,所以这可能不是超级高效的。说…
我想这里可能有一些问题。dockerfile用于创建图像。您需要执行构建步骤。从包含dockerfile的目录中,至少可以执行以下操作:
1 | docker build . |
dockerfile描述要创建的图像。我对MySQL不太了解(我是一个PostgresFanboy),但我在互联网上搜索了"如何初始化MySQL Docker容器"。首先,我创建了一个新目录来工作,我称之为mdir,然后我创建了一个文件目录,其中存放了一个epcis-schema.sql文件,该文件创建了一个数据库和一个表:
1 2 3 4 5 6 7 8 9 | create database test; use test; CREATE TABLE testtab ( id INTEGER AUTO_INCREMENT, name TEXT, PRIMARY KEY (id) ) COMMENT='this is my test table'; |
然后我在文件目录中创建了一个名为init_db的脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #!/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 |
(大部分脚本都是从这里提取的:https://gist.github.com/pda/9697520)
以下是我创建的文件/运行数据库脚本:
1 2 3 4 5 6 7 8 9 |
最后,要绑定它们的dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | FROM mysql MAINTAINER (me) # 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" |
所以,我打开了我的mdir目录(它有dockerfile和files目录)。然后我运行命令:
1 | docker build --no-cache . |
您应该看到这样的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Sending build context to Docker daemon 7.168 kB Sending build context to Docker daemon Step 0 : FROM mysql ---> 461d07d927e6 Step 1 : MAINTAINER (me) ---> 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 |
现在您有一张图像"7F6D5215FE8D"。我可以运行此图像:
1 | docker run -d 7f6d5215fe8d |
图像开始时,我看到一个实例字符串:
1 | 4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3 |
然后我可以"停止"它,然后重新启动它。
1 2 | docker stop 4b377 docker start 4b377 |
如果查看日志,第一行将包含:
1 2 3 4 5 | docker logs 4b377 Populate initial db var/lib/mysql/ ... |
然后,在日志的末尾:
这些是来自/tmp/run_db脚本的消息,第一个消息指示数据库已从保存的(初始)版本解包,第二个消息指示数据库已存在,因此使用了现有副本。
这是我上面描述的目录结构的ls-lr。请注意,init_db和run_db是设置了execute位的脚本:
1 2 3 4 5 6 7 8 9 10 | 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 |
另一种基于前面的服务器响应合并的方法:
Docker撰写文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
其中
在
1 2 3 4 5 6 7 8 9 |
根据官方mysql文档,您可以在
我试过格雷格的回答,但没有成功,我一定是做错了,因为我的数据库在所有步骤之后都没有数据:我使用的是Mariadb的最新图片,以防万一。
然后我决定读取官方Mariadb图像的入口点,并使用它生成一个简单的Docker撰写文件:
1 2 3 4 5 6 7 8 9 10 11 |
现在我能够持久化我的数据并用我自己的模式生成一个数据库!
2015年8月4日以后,如果您使用的是官方mysql docker镜像,只需在/docker-entrypoint-initdb.d/目录中添加/复制一个文件,并初始化容器即可运行。如果要在其他容器映像上实现,请参阅github:https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225
另一个简单的方法是,使用docker compose和以下行:
1 2 3 4 5 |
将数据库架构放入./database/install_db.sql。每次构建容器时,都会执行install_db.sql。
最简单的解决方案是使用tutum/mysql
STEP11 | docker pull tutum/mysql:5.5 |
第二步
1 | docker run -d -p 3306:3306 -v /tmp:/tmp -e STARTUP_SQL="/tmp/to_be_imported.mysql" tutum/mysql:5.5 |
步骤3
获取容器ID的上方,然后执行命令
1 | docker logs #<CONTAINER_ID> |
对于那些不想像我这样创建入口点脚本的人,实际上可以在构建时启动mysqld,然后在dockerfile中执行mysql命令,如下所示:
1 2 3 4 |
这里的关键是用单个
下面是我成功安装xampp、创建带有方案的mariadb以及用本地服务器上使用的信息(usrs、pics orders等)预填充的dockerfile。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | FROM ubuntu:14.04 COPY Ecommerce.sql /root RUN apt-get update \ && apt-get install wget -yq \ && apt-get install nano \ && wget https://www.apachefriends.org/xampp-files/7.1.11/xampp-linux-x64-7.1.11-0-installer.run \ && mv xampp-linux-x64-7.1.11-0-installer.run /opt/ \ && cd /opt/ \ && chmod +x xampp-linux-x64-7.1.11-0-installer.run \ && printf 'y \y \y ' | ./xampp-linux-x64-7.1.11-0-installer.run \ && cd /opt/lampp/bin \ && /opt/lampp/lampp start \ && sleep 5s \ && ./mysql -uroot -e"CREATE DATABASE Ecommerce" \ && ./mysql -uroot -D Ecommerce < /root/Ecommerce.sql \ && cd / \ && /opt/lampp/lampp reload \ && mkdir opt/lampp/htdocs/Ecommerce COPY /Ecommerce /opt/lampp/htdocs/Ecommerce EXPOSE 80 |
在对此进行了一些挣扎之后,使用命名卷(db data)查看dockerfile。重要的是在最后一部分声明一个加号,在这里我提到体积是
这样都很好!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |