【问题标题】:How can I run mysql_upgrade as a part of a docker compose file?如何将 mysql_upgrade 作为 docker compose 文件的一部分运行?
【发布时间】:2020-02-19 16:16:00
【问题描述】:

我有一个 docker-compose.yml 和一个 MariaDB 数据库服务,看起来像这样:

version: '2'

services:
  db:
    container_name: misp_db
    image: mariadb
    restart: unless-stopped
    volumes:
      - ${DATA_DIR}/db:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}

在启动容器时,我注意到以下错误:

[ERROR] Missing system table mysql.roles_mapping; please run mysql_upgrade to create it
[ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 to have type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','EMPTY_STRING_IS_NULL','SIMULTANEOUS_ASSIGNMENT'), found type set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_B
[ERROR] mysqld: Event Scheduler: An error occurred when initializing system tables. Disabling the Event Scheduler.

我可以通过运行 docker exec -it db /bin/bash 来获得一个 shell,然后运行 ​​mysql_upgrade -p 并输入我配置的 MySQL root 密码来解决这个问题,但这应该是自动的。

如何在 Docker Compose 中执行此操作?

【问题讨论】:

  • 你不想固定你的mysql版本吗?现在您总是在获取最新版本,如果确实有更改,则会导致错误。您可以编写一个 bash 脚本来检查升级作为 docker-compose 文件中的命令,但我认为固定版本是一个更明智的解决方案。如果某些应用程序依赖于某个版本的mariadb,它可能会由于版本更新而突然崩溃。
  • 一个字符串,而不是数组:SET sql_mode = 'REAL_AS_FLOAT,PIPES_AS_CONCAT,AN...'

标签: mysql docker docker-compose mariadb


【解决方案1】:

您不能直接从 docker-compose 运行它,但可以使用从 docker-compose 调用的单行 Dockerfile 来完成。

这可以通过简单地将以下内容添加到docker-compose.yaml 文件中的服务定义来完成:

build: .

这将导致docker-compose 运行位于工作目录“.”中的 Dockerfile。

在 Dockerfile 中,您可以自行运行升级脚本。

RUN mysql_upgrade -p

这将导致升级运行一次;在构建图像时。随后,您的 mySQL 版本将在您构建映像时被冻结;不是在您启动容器时。这对我来说似乎是一种合理的方法。

可以从 Dockerfile 运行 entrypoint.sh 脚本(有关更多详细信息,请参阅 here),当您启动容器时会调用该脚本。当您按照最初的要求启动容器时,这将执行升级,但是,我同意@blokje5,启动容器时升级似乎有点冒险。如果他们不小心破坏了某些东西(它发生了),那么曾经工作的图像将不再工作,并且调试起来可能是一场噩梦;特别是因为它发生在服务被认为准备好之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多