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)
该docker-entrypoint-initdb.d
机制仅在数据库容器第一次启动时运行,数据库为空。您需要docker-compose rm
在docker-compose stop
它们之后显式地创建容器以导致删除当前数据库,然后将在新的空数据库中创建一个新的空表。
如果您需要保留现有数据库中的数据,您正在寻找一种称为迁移的机制。各种 Docker 数据库镜像不直接有迁移支持;这几乎总是与您的应用程序级数据库库打包在一起(例如,Ruby on Rails 和 Python 的 SQLAlchemy 都具有迁移功能)。
无论如何,一旦有了迁移系统,最好使用它来创建初始数据库表。 docker-entrypoint-initdb.d
对于创建初始用户或加载种子数据库转储等数据库级设置更有意义,但在实践中,您将始终需要一个迁移系统来进行您所描述的更改。
归档时间: |
|
查看次数: |
4799 次 |
最近记录: |