我正在尝试创建一个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 :(得分: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中导入脚本然后运行服务本身的脚本文件。
答案 3 :(得分:0)
从docker-compose文档 - see Define Services - 您可以告诉它将使用哪个Dockerfile来构建映像。因此,您可以基于mysql映像创建Dockerfile,并使用标准Dockerfile命令在其中创建数据库。
答案 4 :(得分:0)
如果将来有人登陆,这可能会有用。真正的问题似乎是docker-compose文件中的“命令”语句。命令成功完成后,容器将被销毁。只有在docker-compose运行并且已创建容器后,才能运行此sql脚本。 docker-compose“命令”实际上是在容器中启动服务。在这种情况下,您使用命令覆盖mysql服务。