如何使用Docker compose创建一个mysql数据库?

20
我正尝试在Docker上托管一个使用MySQL数据库的应用程序。我正在使用Docker Compose。我的yml文件看起来像这样:

version: '2'
volumes:
  data_sql:    
services:  
medical-mysql:
    image: mysql
    hostname: medical-mysql    
    volumes:    
     - data_sql:/dbcreation.sql
    environment:
      MYSQL_DATABASE: Medical
      MYSQL_ROOT_PASSWORD: root
      STARTUP_SQL: data_sql
    ports:
    - "3306:3306"
  medical-main:
    build: .
    ports:
     - "8080:8080"    
    depends_on:
     - medical-mysql

我有一个dbcreation.sql文件,用于创建数据库模式,并保存在yml文件夹中。 当我运行yml文件时,似乎该文件没有运行。

我错过了什么?


那么,data_sql是什么?何时调用dbcreation.sql文件? - Isky
data_sql只是我创建用于托管创建文件的卷,我找不到其他方法来完成它,而且这个方法也不起作用。 - Izhar Lotem
看起来你正在dbcreation.sql中挂载data_sql。你从未创建过数据库。你需要将它复制到/var/lib/mysql中(而不是dbcreation.sql),如果你想使用它,你需要执行类似这样的命令:mysql -u user db < dbcreation.sql。 - Isky
2个回答

31

只需将您的.sql文件(dbcreation.sql)放入文件夹中(例如/mysql_init),然后像这样将该文件夹添加为卷:

volumes:
  - /mysql_init:/docker-entrypoint-initdb.d

MySQL镜像将在启动时执行/docker-entrypoint-initdb.d中的所有.sql、.sh和.sql.gz文件。


这个文件夹应该放在哪里?在项目级别还是 Docker 容器中? - catch23

25

1)创建转储文件dbcreation.sql

2)创建import.sh文件:

#!/usr/bin/env bash
mysql -u root -p$MYSQL_ROOT_PASSWORD < /tmp/dbcreation.sql

3)创建 docker-compose.yaml

database:
  image: mysql
  container_name: database.dev
  command: mysqld --user=root --verbose
  volumes:
    - ./dbcreation.sql:/tmp/dbcreation.sql
    - ./import.sh:/tmp/import.sh
  ports:
    - "3306:3306"
  environment:
    MYSQL_DATABASE: "test"
    MYSQL_USER: "test"
    MYSQL_PASSWORD: "test"
    MYSQL_ROOT_PASSWORD: "root"
    MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

"- ./dbcreation.sql:/tmp/dbcreation.sql" - "- local_path:path_inside_container"

4) 运行

docker-compose up
docker exec database.dev bash /tmp/import.sh

我在实现你的答案时遇到了问题, 因为一旦我的主容器启动, 它就需要构建数据库. 它确实给了我很多线索, 让我找到了想要的地方. 我将mysql容器创建拆分成一个单独的yml文件. 我编写了一个包含以下内容的sh文件:docker-compose -f mysql.yml up -d sleep 10; docker exec medical-mysql bash /tmp/import.sh docker-compose up它可以工作. 是否有更好的方法来确保mysql容器已准备好,而不是使用sleep? - Izhar Lotem
1
@IzharLotem,这不是关于容器的问题,而是关于容器内的应用程序。容器已经准备好了,但容器内的应用程序还没有准备好。 您需要在应用程序层面上解决它。您可以在“主容器”中检查MySQL数据库的健康状况,或者您可以覆盖Dockerfile中的CMD,并在导入完成后的某个地方放置标志。无论如何,这不是Docker的工作。 - ashatrov
在运行8.0.11版本时,我需要更改“命令”为: command:mysqld --user=root --default-authentication-plugin=mysql_native_password 这使我能够通过MySQL Workbench(v6.3)连接。 - lovebeer84
我得到了:/tmp/import.sh: /tmp/import.sh: 是一个目录。 - eli

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