Docker-Compose - 无法使用命令 --init-file 初始化 MySQL 数据库

Oli*_*ins 5 mysql docker docker-compose

我有一个要在容器中运行的应用程序,以及一个要在容器中运行的数据库。我已经像这样实现了数据库部分。

  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    command: --init-file /SCHEMA.sql
    restart: always
    environment:
      MYSQL_DATABASE: shapeshop
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: root
    networks:
      - backend
Run Code Online (Sandbox Code Playgroud)

我的数据库的初始架构位于一个名为SCHEMA.sql的文件中,该文件与我的docker-compose文件位于同一目录中。

我正在使用

命令--init-文件

配置来设置数据库。

当我运行docker-compose up时,它失败并出现以下错误:

2021-05-14T08:20:59.320203Z 0 [错误] mysqld:找不到文件“/SCHEMA.sql”(错误代码:2 - 没有这样的文件或目录)

我的命令文件指定正确吗?

Tom*_*Tom 6

正如 David Maze 在评论中提到的,您必须将架构文件挂载到容器中。

那么这个命令 --init 只适用于容器内的文件系统吗?

是的。

您还可以完全省略 init 命令,因为映像会自动将.sql转储加载到数据库中。来自文档

[...] 它将执行在 /docker-entrypoint-initdb.d 中找到的扩展名为 .sh、.sql 和 .sql.gz 的文件。[...]您可以通过将 SQL 转储安装到该目录中来轻松填充 mysql 服务[...]。

像这样:

services:
  db:
    image: mysql:5.7
    # If you want to use a custom command, do it like this:
    # command: ["mysqld","--innodb-buffer-pool-size=2G"]
    volumes:
      # Persist data
      - "db_data:/var/lib/mysql"
      # Mount the schema file
      - "./SCHEMA.sql:/docker-entrypoint-initdb.d/SCHEMA.sql"
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: shapeshop
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: root
    networks:
      - backend
    restart: always

volumes:
  db_data:
Run Code Online (Sandbox Code Playgroud)

我还添加了一个卷,/var/lib/mysql以便当您停止并删除容器时,数据会被保留。

  • 这个答案很完美。多年来我已经在许多环境中完成了此操作,并且其行为与描述的完全一样。非常彻底的答案 (2认同)