Перезапустите Docker Compose с обновлением базы данных. - PullRequest
0 голосов
/ 19 мая 2019

Я работал с простой таблицей MySQL, используя Docker Compose, которая включала только столбцы ID и NAME.Я попытался обновить свой файл myDb.sql, который изначально создает таблицу следующим образом:

CREATE TABLE `Person` (
  `id` int(11) NOT NULL,
  `firstName` varchar(50) NOT NULL, // updated this column
  `lastName` varchar(50) NOT NULL  // added this column
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Я обновил столбец NAME до firstName и добавил столбец lastName.

Затем я остановил контейнеры Docker, запустив DOCKER-COMPOSE STOP.

Затем я перезапустил контейнеры Docker, запустив DOCKER-COMPOSE UP.Я даже попробовал DOCKER-COMPOSE RESTART.

Сообщение об ошибке, которое я смог напечатать в консоли, было таким:

SELECT '', id, `firstName` From Person<br>Unknown column 'firstName' in 'field list'

Это заставляет меня поверить, что я не перезапустил Docker Compose правильно.

Какперезапустить Docker Compose, чтобы он выполнял команду CREATE TABLE?

Редактировать

Вот мой файл docker-compose.yml:

version: "3.7"
services:
www:
    build: .
    ports: 
        - "8001:80"
    volumes:
        - ./www:/var/www/html/
    links:
        - db
    networks:
        - default
db:
    image: mysql:5.7.13
    ports: 
        - "3306:3306"
    environment:
        MYSQL_DATABASE: myDb
        MYSQL_USER: user
        MYSQL_PASSWORD: test
        MYSQL_ROOT_PASSWORD: test
    volumes:
        - ./dump:/docker-entrypoint-initdb.d
        - persistent:/var/lib/mysql
    networks:
        - default
phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links: 
        - db:db
    ports:
        - 8000:80
    environment:
        MYSQL_USER: user
        MYSQL_PASSWORD: test
        MYSQL_ROOT_PASSWORD: test
volumes:
    persistent:

Мой файл Docker выглядит такэто:

FROM php:7.0.30-apache 
RUN docker-php-ext-install mysqli

Ответы [ 3 ]

0 голосов
/ 20 мая 2019

Делайте docker-compose down всякий раз, когда вы обновляете вашу схему, она удаляет контейнеры и сеть докеров и делает docker-compose up, чтобы перенести вашу среду с вашей новой схемой.Надеюсь, поможет.Если нет, попробуйте обновить его до последней версии mysql, которой вы используете почти 3 года.

0 голосов
/ 21 мая 2019

Поэтому я подумал, что перезапуск docker-compose автоматически запустит запрос CREATE TABLE в файле myDb.sql.Как указано выше, я изменил имя столбца name на firstName и добавил столбец lastName.

Опять же, я не уверен, была ли команда, которая фактически делает это, но в конце я смог изменить таблицу в phpmyadmin.После того как я изменил таблицу, теперь я возвращаю данные на страницу без ошибок.

0 голосов
/ 19 мая 2019

Механизм docker-entrypoint-initdb.d запускается только при первом запуске контейнера базы данных с пустой базой данных.Вам нужно явно docker-compose rm свои контейнеры после того, как вы docker-compose stop их вызовете, чтобы удалить текущую базу данных, а затем в новой пустой базе данных будет создана новая пустая таблица.

Если вам нужночтобы сохранить данные в существующей базе данных, вы ищете механизм, называемый миграция .Различные образы базы данных Docker напрямую не поддерживают миграцию;это почти всегда то, что упаковано с вашей библиотекой базы данных уровня приложения (например, Ruby on Rails и SQLAlchemy в Python имеют возможности миграции).

Если у вас в любом случае есть система миграции, вероятно, лучшеиспользуйте это для создания исходных таблиц базы данных.docker-entrypoint-initdb.d имеет немного больше смысла для настройки на уровне базы данных, такой как создание начальных пользователей или загрузка исходного дампа базы данных, но на практике вам всегда понадобится система миграции для таких изменений, как вы описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...