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

时间:2019-05-19 14:27:43

标签: mysql docker docker-compose

我一直在使用Docker Compose处理一个简单的MySQL表,该表仅包含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-COMPOSE STOP来停止Docker容器。

然后我通过运行DOCKER-COMPOSE UP重新启动Docker容器。我什至尝试了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:

我的Dockerfile看起来像这样:

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

每当您更新架构时执行docker-compose down,它将删除容器和docker网络,并执行docker-compose up使您的环境与新架构一起使用。希望能帮助到你。如果没有,请尝试更新到最新的mysql映像,您正在使用的映像已使用了将近3年。

答案 2 :(得分:0)

因此,我想重新启动docker-compose会自动在myDb.sql文件中运行CREATE TABLE查询。如上所述,我将“名称”列的名称更改为“ firstName”,并添加了一个名为“ lastName”的列。

同样,我不确定是否有实际执行此命令的命令,但最后,我能够更改phpmyadmin中的表。一旦更改了那里的表格,现在我就可以将数据正确返回到页面了。