【问题标题】:How can I create a mysql db with Docker compose?如何使用 Docker compose 创建 mysql 数据库?
【发布时间】:2016-03-07 13:33:15
【问题描述】:

我正在尝试在 docker 上托管一个使用 MySQL db 的应用程序。我正在使用 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,它创建了 db 模式并保存在 yml 文件夹中。当我运行 yml 文件时,似乎该文件没有运行。

我错过了什么?

【问题讨论】:

  • 那么什么是 data_sql 以及何时调用 dbcreation.sql ?
  • data_sql 只是我为托管创建文件而创建的卷。我找不到任何其他方法可以做到这一点,而且这个也行不通。
  • 看来您正在 dbcreation.sql 中安装 data_sql。你永远不会创建数据库。你需要复制 /var/lib/mysql (而不是 dbcreation.sql 如果你想使用它,你需要执行类似的东西:mysql -u user db

标签: mysql docker-compose


【解决方案1】:

只需将 .sql 文件 (dbcreation.sql) 放入文件夹(即 /mysql_init),然后将文件夹添加为卷,如下所示:

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

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

【讨论】:

  • 这个文件夹应该在哪里?在项目级别还是 docker 容器?
【解决方案2】:

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 它可以工作。有没有比 sleep 更好的方法来确保 mysql 容器准备就绪?
  • @IzharLotem 它不是关于容器,而是关于内部的应用程序。容器已准备好,但容器内的应用程序没有。您需要在应用程序级别解决它。您可以在“主容器”中检查 MySQL 数据库的运行状况,也可以在 Dockerfile 中覆盖 CMD 并在导入完成后将标志放在某处。无论如何,这不是码头工人的工作。
  • 针对 8.0.11 运行,我需要将“command”更改为: command: mysqld --user=root --default-authentication-plugin=mysql_native_password 这允许我通过 MySQL Workbench (v6 .3)
  • 我得到:/tmp/import.sh: /tmp/import.sh: 是一个目录
猜你喜欢
  • 2015-11-08
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多