重新启动 Docker Compose 并更新数据库

Joh*_*ley 1 mysql docker docker-compose

我一直在使用仅包含 ID 和 NAME 列的 Docker Compose 处理一个简单的 MySQL 表。我尝试更新最初创建表的 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;
Run Code Online (Sandbox Code Playgroud)

我将 NAME 列更新为 firstName,并添加了一个 lastName 列。

然后我通过运行 DOCKER-COMPOSE STOP 停止了 Docker 容器。

然后我通过运行 DOCKER-COMPOSE UP 重新启动了 Docker 容器。我什至尝试过 DOCKER-COMPOSE RESTART。

我能够在控制台中打印的错误消息是这样的:

SELECT '', id, `firstName` From Person<br>Unknown column 'firstName' in 'field list'
Run Code Online (Sandbox Code Playgroud)

这让我相信我没有正确重启 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:
Run Code Online (Sandbox Code Playgroud)

我的 Dockerfile 看起来像这样:

FROM php:7.0.30-apache 
RUN docker-php-ext-install mysqli
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 7

docker-entrypoint-initdb.d机制仅在数据库容器第一次启动时运行,数据库为空。您需要docker-compose rmdocker-compose stop它们之后显式地创建容器以导致删除当前数据库,然后将在新的空数据库中创建一个新的空表。

如果您需要保留现有数据库中的数据,您正在寻找一种称为迁移的机制。各种 Docker 数据库镜像不直接有迁移支持;这几乎总是与您的应用程序级数据库库打包在一起(例如,Ruby on Rails 和 Python 的 SQLAlchemy 都具有迁移功能)。

无论如何,一旦有了迁移系统,最好使用它来创建初始数据库表。 docker-entrypoint-initdb.d对于创建初始用户或加载种子数据库转储等数据库级设置更有意义,但在实践中,您将始终需要一个迁移系统来进行您所描述的更改。