使用docker-compose创建一个MySQL模式/数据库

问题描述:

我想创建一个mysql数据库/模式,如果它不存在。使用docker-compose创建一个MySQL模式/数据库

这是我曾尝试:

泊坞窗,compose.yml

mysql: 
    image: mysql:5.6.26 
    environment: 
    - MYSQL_ROOT_PASSWORD=root 
    command: "mysql -uroot -proot < createDB.sql" 
    ports: 
    - "3306:3306" 

createDB.sql

CREATE DATABASE IF NOT EXISTS bignibou; 

它不工作。如果创建模式不存在,使用docker/docker-compose创建模式的最佳方式是什么?

+0

createDB.sql有'USE bignibou;'作为它的第一行吗? –

+0

不是。它没有这条线...... – balteo

+0

我上面的docker-compose的问题是'command:'应该运行容器。因此,我正在寻找一种方法来在容器上运行一个后命令... – balteo

我终于找到了解决的开始。

MySQL的图像需要一个环境变量,即MYSQL_DATABASE与图像启动时看到这里充满documentation数据库的名称初始化容器。

或阅读以下摘录:

MYSQL_DATABASE

这个变量是可选的,并允许您指定要在图像启动时创建一个 数据库的名称。如果提供的用户/密码为 (见下文),则该用户将被授予超级用户访问 (对应于GRANT ALL)到该数据库。

这里是我想出了:

mysql: 
    image: mysql:5.6.26 
    environment: 
    - MYSQL_ROOT_PASSWORD=root 
    - MYSQL_DATABASE=bignibou 
    ports: 
    - "3306:3306" 

我现在需要一种方法来指定默认的整理,但是那是另一个故事...

编辑:对于那些有兴趣在指定与默认值不同的排序规则时,以下是使用另一个将覆盖默认值的配置文件的说明。请看下图:

使用自定义MySQL配置文件中的MySQL启动 配置在文件/etc/mysql/my.cnf规定,并 文件又包含在/ etc/mysql的找到的所有文件/conf.d 以.cnf结尾的目录。在这个目录中的文件中的设置将会增加和/或覆盖/etc/mysql/my.cnf中的设置 。如果要使用定制的MySQL配置 ,则可以在主机上的目录中创建替代 配置文件,然后将 的目录位置挂载为mysql 容器内的/etc/mysql/conf.d。

如果/my/custom/config-file.cnf是自定义配置文件的路径和名称,可以像这样启动mysql容器(注意 只使用自定义配置文件的目录路径在此 命令):

$泊坞窗运行--name一些MySQL的-v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD =我的秘密-PW -d mysql的:这个标签将启动一个新的 容器some-mysql,其中MySQL实例使用来自/etc/mysql/my.cnf和 /etc/mysql/conf.d/config-file.cnf的组合 启动设置,其中来自后者的设置 优先。

+0

相信我:使用脚本和Dockerfile更容易 – Grasshopper

+3

以下是在docker-compose.yml文件中指定默认排序规则的方法:mysql: image:mysql:5.7 command:[mysqld,--character-set- server = utf8mb4,--collat​​ion-server = utf8mb4_unicode_ci] – William

从docker-compose文档 - see Define Services - 你可以知道它将用于构建图像的Dockerfile。因此,您可以基于mysql映像创建Dockerfile,并使用标准Dockerfile命令在其中创建数据库。

+0

嗨。嗯。唯一的问题是,如果我想升级到另一个版本的mysql,我需要更改Dockerfile并使用创建数据库的自定义命令对其进行更新。这是不是一个大问题,但不完全干净,因为我不扩展Dockerfile,但修改它... – balteo

可能您正在尝试执行的操作需要额外的脚本。因此,如果构建映像而不是直接使用预构建映像是您的选择,则需要使用Dockerfile并使用脚本文件,该文件首先在MySql中导入脚本,然后运行服务本身。

看看这个答案:Docker - Initialize mysql database with schema

+0

您好@mohamnag和感谢您的答复!我已经添加了对蚱蜢的回复的评论,这也适用于您的帖子。 – balteo

+0

上面提到的链接是你有一个dockerfile的情况,你不知道DB是一个新的还是一个不会被初始化的旧的。在你的情况下最好的解决方案很大程度上取决于哪个版本应升级到哪个版本。某些时候安装外部音量并在新的音量上重新使用它有时不会奏效。 – mohamnag

如果有人在将来登陆这里,这可能会很有用。真正的问题似乎是docker-compose文件中的“command”语句。一旦命令成功完成,容器将被销毁。只有在docker-compose运行并创建了容器后,才能运行此SQL脚本。 docker-compose“command”真的是在容器中启动一项服务。在这种情况下,你用你的命令覆盖了mysql服务。