我最近几天一直在使用Docker,我希望很快就能将我的Python-MySQL webapp转移到Docker。
结果是我需要使用Docker卷并且最近被遗忘了。我可以直接创建一个卷
$ docker volume create my-vol
或者通过在docker运行调用中引用不存在的卷来间接,但我无法弄清楚如何使用我的.sql数据库文件填充这些卷,而无需通过Dockerfile中的COPY调用复制文件。
我已经尝试在包含.sql文件的目录中直接创建卷(上面提到的第一种方法),并在我的'docker run'调用中挂载包含.sql文件的目录,这会将.sql文件移动到容器中(我通过导航容器内的bash shell看到了它但是当运行连接到包含数据库的mariadb容器的mariadb容器时(如mariadb docker自述文件中所建议的那样),它只有标准数据库(information_schema,mysql, performance_schema)
如何创建包含预先存在的.sql数据库的卷?
在docker容器中使用mariadb时,映像支持在容器的第一次启动时运行.sql
文件。这允许您在数据可访问之前将数据推送到数据库中。
Initializing a fresh instance
当容器第一次启动时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行在
.sh
中找到的扩展名为.sql
,.sql.gz
和/docker-entrypoint-initdb.d
的文件。文件将按字母顺序执行。您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像,轻松填充mariadb服务。默认情况下,SQL文件将导入到MYSQL_DATABASE
变量指定的数据库中。
这意味着如果要将数据注入容器,则首次启动时。在你的Dockerfile
中,COPY
将.sql
文件放入路径/docker-entrypoint-initdb.d/myscript.sql
的容器中 - 它将在您在环境变量MYSQL_DATABASE
中指定的数据库上调用。
像这样:
FROM mariadb
COPY ./myscript.sql /docker-entrypoint-initdb.d/myscript.sql
然后:
docker run -e MYSQL_DATABASE=mydb mariadb
那么就存在如何管理数据库存储的问题。你基本上有两个选择:
docker run的一个例子:
docker run -v /my/own/datadir:/var/lib/mysql mariadb
docker volume create my_mariadb_volume
docker run -v my_mariadb_volume:/var/lib/mysql mariadb
这也包括在docs for the mariadb码头图像中。如果您打算使用此图像,我建议您从上到下阅读。