我一直在使用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
答案 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中的表。一旦更改了那里的表格,现在我就可以将数据正确返回到页面了。