代码之家  ›  专栏  ›  技术社区  ›  John Beasley

重新启动docker compose并更新数据库

  •  0
  • John Beasley  · 技术社区  · 6 年前

    我一直在使用一个简单的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-COMPOSE STOP来停止Docker容器。

    然后通过运行Docker-COMPOSE UP重新启动Docker容器。我甚至试过重新启动DOCKER-Come。

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

    这让我相信我没有正确重启Docker编写。

    编辑

    这是我的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:
    

    FROM php:7.0.30-apache 
    RUN docker-php-ext-install mysqli
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   David Maze    6 年前

    这个 docker-entrypoint-initdb.d 机制只在数据库容器第一次启动时运行,数据库为空。你需要明确 docker-compose rm 你身后的集装箱 docker-compose stop 它们将导致删除当前数据库,然后在新的空数据库中创建新的空表。

    迁移 . 各种Docker数据库映像没有直接的迁移支持;这几乎总是打包在应用程序级数据库库中(例如,RubyonRails和Python的SQLAlchemy都有迁移工具)。

    不管怎样,一旦有了迁移系统,最好使用它来创建初始的数据库表。 docker入口点initdb.d 对于创建初始用户或加载种子数据库转储之类的数据库级设置来说,这样做更有意义,但实际上,对于所描述的更改,您始终需要一个迁移系统。

        2
  •  0
  •   Prasanth    6 年前

    docker-compose down docker-compose up 为您的环境带来新的模式。希望有帮助。如果没有,请尝试更新到最新的mysql映像,您使用的映像已经有3年的历史了。

        3
  •  0
  •   John Beasley    6 年前

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

    再说一次,我不确定是否有一个命令真正做到了这一点,但最后,我能够在phpmyadmin中修改表。一旦我修改了那里的表,现在我就可以毫无错误地将数据返回到页面。