如何在Docker容器中初始化一个带有模式的MySQL数据库?
我正试图创建一个带有MySQL数据库的容器,并向这些数据库添加一个模式。
我目前的Docker文件是。
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
为了创建容器,我按照Docker上提供的文档,执行了这个命令。
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
但是当我执行这个命令时,容器没有被创建,在容器状态中可以看到CMD没有被成功执行,实际上只有mysql
命令被执行。
总之,有没有办法用模式来初始化数据库,或者我需要手动执行这些操作?
141
3
我很抱歉给你这个超长的答案,但是,你还有一段路要走,才能达到你想要的效果。 我想说的是,通常情况下,你不会把数据库的存储放在与数据库本身相同的容器中,你会装载一个主机卷,以便数据在docker主机上持续存在,或者,也许可以使用一个容器来保存数据(/var/lib/mysql)。 另外,我是mysql的新手,所以,这可能不是非常有效。这就是说...
我认为这里可能有几个问题。 Dockerfile是用来创建一个镜像的。 你需要执行构建步骤。 至少,从包含Docker文件的目录中,你可以做一些事情,比如:
Dockerfile描述了要创建的镜像。 我对mysql了解不多(我是一个postgres粉丝),但是,我在互联网上搜索了一下'我如何初始化mysql docker容器'。 首先,我创建了一个新的目录来工作,我称之为mdir,然后我创建了一个文件目录,我把epcis_schema.sql文件存入其中,它创建了一个数据库和一个表。
然后我在files目录下创建了一个名为init_db的脚本。
(这个脚本的大部分内容是从这里引用的:https://gist.github.com/pda/9697520)
下面是我创建的files/run_db脚本。
最后,Docker文件将它们全部绑定。
所以,我cd'ed到我的mdir目录(其中有Dockerfile和文件目录)。然后我运行了这个命令。
你应该看到这样的输出。
你现在有一个图像'7f6d5215fe8d'。 我可以运行这个图像。
并且图像开始,我看到一个实例字符串。
然后我可以'停止'它,并重新启动它。
如果你看一下日志,第一行会包含。
然后,在日志的最后。
这些是来自/tmp/run_db脚本的信息,第一个表明数据库是从保存的(初始)版本中解压的,第二个表明数据库已经在那里了,所以使用了现有的副本。
下面是我上面描述的目录结构的ls -lR。 注意,init_db和run_db是设置了execute位的脚本。
我尝试了Greg的答案,但没有成功,我一定是做错了什么,因为我的数据库在所有步骤之后都没有数据。我使用的是MariaDB的最新镜像,只是为了以防万一。
然后我决定读取官方[MariaDB镜像]的入口(https://github.com/docker-library/mariadb/blob/c64262339972ac2a8dadaf8141e012aa8ddb8c23/10.1/docker-entrypoint.sh),并使用它来生成一个简单的*docker-compose*文件。
现在,我能够坚持我的数据,并且用我自己的模式生成一个数据库!
最简单的解决方案是使用tutum/mysql。
Step1
Step2
Step3
获取上述CONTAINER_ID,然后执行
docker logs
命令,查看生成的密码信息。