docker-compose mysql init sql 未执行

Posted

技术标签:

【中文标题】docker-compose mysql init sql 未执行【英文标题】:docker-compose mysql init sql is not executed 【发布时间】:2018-11-11 13:35:50 【问题描述】:

我正在尝试设置一个 mysql docker 容器并执行 init sql 脚本。不幸的是,没有执行 sql 脚本。我做错了什么?

version: '3.3'
services:
  api:
    container_name: 'api'
    build: './api'
  ports:
    - target: 8080
      published: 8888
      protocol: tcp
      mode: host
  volumes:
    - './api:/go/src/app'
  depends_on:
    - 'mysql'
 mysql:
  image: 'mysql:latest'
  container_name: 'mysql'
  volumes:
    - ./db_data:/var/lib/mysql:rw
    - ./database/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
  restart: always
  environment:
    MYSQL_USER: test
    MYSQL_PASSWORD: test
    MYSQL_ROOT_PASSWORD: test
    MYSQL_DATABASE: test
  ports:
    - '3306:3306'
volumes:
  db_data:

我用docker-compose up -d --build执行文件

【问题讨论】:

db_data 文件夹可能包含容器之前运行的数据。尝试清理容器,删除数据文件夹并重新开始 谢谢!删除 db_data 文件夹解决了! 【参考方案1】:

docker-entrypoint-initdb.d 文件夹只会在创建(实例化)容器时运行一次,因此您实际上必须执行 docker-compose down -v 才能重新激活它以供下次运行。

如果您希望能够随时添加 sql 文件,您可以在此处查看专门的 MySql docker 映像...http://ivo2u.nl/o4

【讨论】:

【参考方案2】:

许多容器化应用程序,尤其是有状态的应用程序,都有运行init 脚本的方式(如此处的 sql 脚本)并且它们应该只运行一次一次

由于它们是有状态的,卷是容器在容器重启时是否运行 init 脚本的真实来源。

与您的情况一样,删除用于绑定挂载的文件夹或使用新的命名卷应重新运行存在的任何 init 脚本。

【讨论】:

如何知道绑定挂载文件夹是什么? 在大多数情况下,它是挂载到/var/lib/mysql 的文件夹。这是 mysql 的默认值,可以在 mysql.cnf 文件中更改(挂载)。在上面的示例中,绑定是./db_data【参考方案3】:

这些脚本在您创建容器时运行,而不是每次启动时运行。

您可以docker-compose up --force-recreate mysql 强制重新运行这些脚本。

另外,如果你有./db_data:/var/lib/mysql:rw这样的卷,那么你还需要在重新创建容器之前删除./db_data

我不是 docker 专家,但这对我有用。

【讨论】:

以上是关于docker-compose mysql init sql 未执行的主要内容,如果未能解决你的问题,请参考以下文章

Docker-compose mysql:导入 .sql

docker-compose yaml mysql和wordpress 一行命令搞定~~~

docker-compose:nodejs + mysql无法连接mysql

使用 docker-compose 运行 MySQL

docker-compose 中的 MySQL -- 访问被拒绝

docker-compose部署mysql配置