我正在尝试使用MySQL数据库创建一个容器,并为这些数据库添加一个模式 .
我目前的Dockerfile是:
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
但是当我执行此命令时,不会创建Container,并且在Container状态下可以看到CMD未成功执行,实际上只执行了 mysql
命令 .
无论如何,有没有办法用模式初始化数据库,还是我需要手动执行这些操作?
10 回答
我很抱歉这个超长的答案,但是,你有一点路可以到达你想要的地方 . 我会说通常你不会把数据库的存储放在与数据库本身相同的容器中,你要么安装一个主机卷,以便数据在docker主机上存在,或者也许一个容器可以用来保存数据(/ var / lib / mysql) . 另外,我是mysql的新手,所以,这可能不是超级高效的 . 那说......
我想这里可能有一些问题 . Dockerfile用于创建图像 . 您需要执行构建步骤 . 至少,从包含Dockerfile的目录中,您可以执行以下操作:
Dockerfile描述了要创建的图像 . 我不太了解mysql(我是一个postgres粉丝),但是,我在互联网上搜索了“我如何初始化一个mysql docker容器” . 首先我创建了一个新的目录,我称之为mdir,然后我创建了一个文件目录,我存放了一个epcis_schema.sql文件,该文件创建了一个数据库和一个表:
然后我在files目录中创建了一个名为init_db的脚本:
(大部分脚本都是从这里解除的:https://gist.github.com/pda/9697520)
这是我创建的files / run_db脚本:
最后,Dockerfile将它们全部绑定:
所以,我cd到了我的mdir目录(其中包含Dockerfile和files目录) . 然后我运行命令:
你应该看到这样的输出:
您现在有了一个图像'7f6d5215fe8d' . 我可以运行这个图像:
并且图像开始,我看到一个实例字符串:
我可以'停止'它,然后重新启动它 .
如果查看日志,第一行将包含:
然后,在日志的末尾:
这些是来自/ tmp / run_db脚本的消息,第一个表示数据库已从保存的(初始)版本解压缩,第二个表示数据库已存在,因此使用了现有副本 .
这是我在上面描述的目录结构的ls -lR . 请注意,init_db和run_db是设置了执行位的脚本:
我有同样的问题,我想初始化我的MySQL Docker实例的架构,但在做了一些谷歌搜索并跟随其他人的例子后,我遇到了困难 . 这是我解决它的方式 .
1)将MySQL架构转储到文件中 .
2)使用ADD命令将架构文件添加到Docker容器中的
/docker-entrypoint-initdb.d
目录 .docker-entrypoint.sh
文件将针对MySQL数据库运行此目录中以".sql"
结尾的任何文件 .Dockerfile:
3)启动Docker MySQL实例 .
感谢Setting up MySQL and importing dump within Dockerfile在docker-entrypoint.sh上为我提供了线索,以及它运行SQL和shell脚本的事实!
我已经尝试过Greg的回答并没有成功,我必须做错了,因为我的数据库在所有步骤之后都没有数据:我正在使用MariaDB的最新图像,以防万一 .
然后我决定阅读官方MariaDB image的入口点,并使用它来生成一个简单的docker-compose文件:
现在我能够保留我的数据并使用我自己的架构生成数据库!
另一种基于此前几个响应合并的方法:
docker-compose文件:
其中
/home/user
..是主机上的共享文件夹并在
/home/user/db/mysql/init
文件夹中..只需删除一个带有任何名称的sql文件,例如init.sql
包含:根据official mysql documentation,您可以在
docker-entrypoint-initdb.d
中放置多个sql文件,它们按字母顺序执行2015年8月4日之后,如果您使用官方的mysql Docker镜像,只需将文件添加/复制到/docker-entrypoint-initdb.d/目录中即可运行与容器初始化 . 如果要在其他容器映像上实现它,请参阅github:https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225
最简单的解决方案是使用tutum/mysql
Step1
Step2
Step3
获取CONTAINER_ID以上,然后执行命令
docker logs
以查看生成的密码信息 .另一种简单的方法,使用docker-compose和fallowing行:
将数据库架构放入./database/install_db.sql . 每次构建容器时,都会执行install_db.sql .
对于那些不想创建像我这样的入口点脚本的人,你实际上可以在构建时启动mysqld然后在你的Dockerfile中执行mysql命令,如下所示:
这里的关键是使用单个
&
符号将mysqld_safe发送到后台 .在稍微努力之后,使用命名卷(db-data)查看Dockerfile . 重要的是在最后部分声明一个加号,我提到的那个卷是
[external]
这一切都很棒!
下面是我成功用于安装xampp的Dockerfile,使用scheme创建MariaDB并预填充本地服务器上使用的信息(usrs,pics order等) .