Как я могу запустить mysql_upgrade как часть docker compose файла? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть 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, чтобы получить оболочку, а затем запустив mysql_upgrade -p и введя мой настроенный пароль MySQL root, но это следует автоматизировать.

Как я могу это сделать это в Docker Составить?

1 Ответ

1 голос
/ 20 февраля 2020

Вы не можете запустить его непосредственно из docker -compose, но это можно сделать довольно просто, используя однострочный Dockerfile, вызываемый из docker -compose.

Это можно сделать просто добавив следующее к определению вашей службы в файле docker-compose.yaml:

build: .

Это заставит docker-compose запустить файл Docker, расположенный в рабочем каталоге ".".

В Dockerfile, вы можете запустить сам скрипт обновления.

RUN mysql_upgrade -p

Это приведет к однократному запуску обновления; во время построения изображения. Впоследствии ваша mySQL версия будет заморожена во время создания образа; не когда вы запускаете контейнер. Мне кажется, что это разумный подход.

Вы могли бы запустить точку входа. sh скрипт из Dockerfile (см. здесь для более подробной информации), который получает вызывается при запуске контейнера. Это позволит выполнить обновление, когда вы запустите контейнер, как вы изначально запрашивали, но, я согласен с @ blokje5, обновление при запуске контейнера кажется немного рискованным. Если они случайно что-то сломают (это случается), то изображение, которое когда-то работало, больше не будет работать, и это может быть отчасти кошмаром для отладки; тем более что это происходит до того, как услуга считается готовой.

...