使用docker-compose创建MySQL架构/数据库

时间:2015-08-15 14:56:31

标签: mysql docker 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创建架构的最佳方法是什么?

5 个答案:

答案 0 :(得分:23)

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

MySQL镜像采用环境变量,即 MYSQL_DATABASE ,在图像启动时使用数据库名称初始化容器。请参阅此处查看完整documentation

或阅读下面的摘录:

  

MYSQL_DATABASE

     

此变量是可选的,允许您指定a的名称   要在映像启动时创建的数据库。如果是用户/密码   提供(见下文)然后该用户将被授予超级用户访问权限   (对应于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配置,您可以创建替代方案   配置文件在主机上的目录中然后挂载   那个目录位置为/etc/mysql/conf.d里面的mysql   容器

     

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

     

$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e   MYSQL_ROOT_PASSWORD = my-secret-pw -d mysql:tag这将启动一个新的   容器some-mysql,其中MySQL实例使用组合   来自/etc/mysql/my.cnf和的启动设置   /etc/mysql/conf.d/config-file.cnf,来自后者的设置   优先考虑。

答案 1 :(得分:3)

为了不丢失数据,还可以更好地使用卷:

version: '3'
services:
  db:
    image: mysql:5.7
    volumes:
        - mysql-db:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: my_db_name
    ports:
        - "3307:3306"
volumes:
  mysql-db:

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果将来有人登陆,这可能会有用。真正的问题似乎是docker-compose文件中的“命令”语句。命令成功完成后,容器将被销毁。只有在docker-compose运行并且已创建容器后,才能运行此sql脚本。 docker-compose“命令”实际上是在容器中启动服务。在这种情况下,您使用命令覆盖mysql服务。