it-swarm.dev

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

我正在尝试创建一个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创建架构的最佳方法是什么?

17
balteo

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

MySQL映像采用环境变量,即 MYSQL_DATABASE 在映像启动时使用数据库的名称初始化容器请参见此处获取完整 文档

或者阅读以下摘录:

MYSQL_DATABASE

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

这是我想出的:

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

我现在需要一种方法来指定默认排序规则但这是另一个故事......

edit :对于那些有兴趣从默认值中指定不同排序规则的人,以下是使用另一个将覆盖默认排序规则的配置文件的说明。见下文:

使用自定义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容器(请注意,此命令中仅使用自定义配置文件的目录路径):

$ 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 instance使用/etc/mysql/my.cnf和/etc/mysql/conf.d/config-file.cnf中的组合启动设置,后者的设置优先。

23
balteo

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

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:
3
Codenator81

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

看看这个答案: Docker - 使用模式初始化mysql数据库

1
mohamnag

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

0
Grasshopper

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

0
Dean Sha