我需要创建一个具有大型数据库的Docker映像。可以使用脚本populate_net_db.sh
从指定的文件夹中填充数据库。我需要创建在构建时完成此操作的Docker映像,以便使用数据库的开发人员可以创建容器,而不必等待很长时间才能填充数据库。
我做了什么(这可行,但不是我所需要的):
我可以在运行时创建数据库,并使用mysql Docker映像填充它,并将所需的文件放入docker-entrypoint-initdb.d
文件夹中。运行映像时,这将需要花费大量时间来进行设置,但是可以根据需要运行,并且我可以完全根据需要使用docker exec -it "image_name" mysql -u root -p
访问数据库。
我可以在构建时使用RUN命令创建相同的数据库,并看到在构建时已正确设置了表,但是,当我运行这样的映像时,将建立一个新的mysql DB并从构建中获取该DB不见了。
是否可以在docker exec -it "image_name" mysql -u root -p
中显示构建时数据库?
答案 0 :(得分:0)
我设法通过在构建过程中将/var/lib/mysql/
的内容保存为一个临时文件夹来解决此问题:mv /var/lib/mysql /mnt/tmp/
。然后,我创建了一个入口点脚本来放入/docker-entrypoint-initdb.d
文件夹中。该脚本在运行时删除/var/lib/mysql/
的内容,并将保存的状态从/mnt/tmp/
中移出。这将导致MySQL重新启动。但是,数据库在容器运行时变得非常快速可用。对于27GB的数据库,此方法大约需要5分钟,而从转储文件中加载数据库需要1小时以上。