我想在 mysql 上创建一个 docker 镜像,该镜像已经包含我的应用程序所需的方案。
我尝试向 Dockerfile 添加行,将我的方案作为 sql 文件导入。我是这样做的(我的 Dockerfile):
FROM mysql
ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"
ADD imhere.sql /tmp/imhere.sql
RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"
据我了解,这不起作用,因为 mysql docker 映像不包含 mysql 客户端(最佳实践状态“不要添加东西只是因为它们会很好”)(我错了吗?)
什么可能是这样做的好方法?我有一些想法,但它们似乎都是混乱的解决方法。
- 安装 mysql 客户端,做我必须做的事情,然后删除/清除它。
- 将 mysql 客户端二进制文件复制到映像中,做我必须做的,然后将其删除。
- 在另一个 sql server 中创建模式并直接复制 db 文件本身(这看起来很混乱,对我来说听起来像是一个受污染的问题池)
有什么建议么?希望以一种以后易于维护的方式,并且可能也符合最佳实践?
为了测试目的,我不得不这样做。
以下是我利用 dockerhub 上的实际 MySQL/MariaDB 映像和多阶段构建的方法:
完整的工作示例:https ://github.com/lindycoder/prepopulated-mysql-container-example
您应该将您的 init 脚本放在安装为的目录中- 请参阅MySQL Docker 映像文档
/docker-entrypoint-initdb.d
中的“初始化新实例”部分。感谢@Martin Roy
对 mysql 进行了微小的更改...
内容 Dockerfile
内容 setup.sql
完整的工作示例:https ://github.com/iamdvr/prepopulated-mysql-container-example
这是可行的,它遵循 mariadb 入口点脚本的接口。包含设置、表格、数据和用户的文件被复制到文件夹中。当容器启动时,入口点脚本会找到文件并创建一个新数据库。
这是我的 docker 文件工作得很好。/sql-scripts/ 将包含您的自定义 sql 文件(包含您准备好的数据库),该文件在容器运行后执行。不过,您可能想查看卷安装。
@Venkateswara Rao 和 @Martin Roy 的答案非常有用,如果您不关心对 dockerized 数据库的更改是否仍放在卷中。就我而言,我想要一个预填充数据的 Docker 映像,但在我们经常进行数据库迁移的项目中。因此,我想偶尔创建一个数据库容器,运行迁移,然后以某种方式将这些更改推送回去,以便下一个使用数据库映像的用户已经应用了迁移。由于数据库文件存在于卷中,因此它们不会卷入带有
docker commmit my-migrated-db-container my-new-db-image
.我的解决方案是使用官方MySQL(在我的情况下为 5.6)Dockerfile(和入口点文件
VOLUME /var/lib/mysql
)在删除该行后重新创建他们的工作。然后,从生成的图像中,我使用 Venkateswara 的文件制作了一个预加载的数据库图像,其中甚至所有未来的数据库数据都存储在容器本身(而不是卷上)中。注意:链接的 Dockerfile 文件是旧的,指的是过时的 GPG 密钥服务器(即
keys.openpgp.org
)。您可以将这些服务器名称替换为keyserver.ubuntu.com
.Ansible 等管理软件可以帮助您轻松自动导入 mysql,而无需安装和重新安装客户端。Ansible 具有强大的内置功能来管理 docker 镜像和容器以及 mysql 数据库。