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

19

我正在尝试创建一个mysql数据库/模式,如果它不存在的话。以下是我的尝试:

docker-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来创建一个不存在的模式?


没有。它没有这行代码... - balteo
要运行post命令,请尝试:docker exec -i db mysql -uroot -proot bignibou < createDB.sql - Valery Viktorovsky
@ValeryViktorovsky:我应该把这个命令放在哪里?你的意思是作为一个“独立”的命令,与docker-compose.yml文件分开吗? - balteo
我该如何自动化执行这个命令? - balteo
可以使用像Ansible这样的自动化工具。 - Valery Viktorovsky
显示剩余7条评论
5个回答

25

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

MySQL镜像采用一个环境变量,即MYSQL_DATABASE,该变量在图像启动时初始化容器,并指定数据库名称。请查看此处获取完整的文档

或者阅读以下摘录:

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中,该文件又包括任何以.cnf结尾的位于/etc/mysql/conf.d目录中的文件。在该目录中的文件中的设置将增强和/或覆盖/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的组合启动设置,以后者的设置为优先。


相信我:使用脚本和Dockerfile会容易得多。 - Grasshopper
3
以下是在docker-compose.yml文件中指定默认排序规则的方法: mysql: image: mysql:5.7 command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci] (注:该命令指定了mysql镜像使用utf8mb4字符集和utf8mb4_unicode_ci排序规则) - William

4

为了不丢失您的数据,最好也使用卷:

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

可能你试图做的事情需要一个额外的脚本。因此,如果你可以建立一个图像而不是直接使用预先构建的图像,那么你需要使用一个Dockerfile,并使用一个脚本文件,该文件首先导入MySql中的脚本,然后运行服务本身。

看一下这个答案:Docker-初始化带有模式的mysql数据库


嗨@mohamnag,感谢您的回复!我已经在草蜢的回复中添加了一条评论,也适用于您的帖子。 - balteo
上述链接是在您拥有Dockerfile但不确定DB是新的还是旧的且不需要初始化的情况下。在您的情况下,最好的解决方案非常取决于要升级到哪个版本。有时,将外部卷挂载并在新卷上重新使用会奏效,有时则不会。 - mohamnag

0
从 docker-compose 文档 - 查看定义服务 - 中可以知道使用哪个 Dockerfile 来构建镜像。因此,您可以基于 mysql 镜像创建 Dockerfile 并使用标准的 Dockerfile 命令在其中创建数据库。

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

0
这可能对未来有用。真正的问题似乎在于docker-compose文件中的“command”语句。一旦命令成功完成,容器将被销毁。此SQL脚本必须在docker-compose运行并创建容器后才能运行。docker-compose的“command”实际上是启动容器中的服务。在这种情况下,您使用命令覆盖了mysql服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接