我有一个 docker.compose 文件,当我启动它时,我希望它创建一个包含一些表的数据库。
我的码头工人撰写:
services:
mysql:
image: mysql:latest
container_name: mysqldb
cap_add:
- SYS_NICE # CAP_SYS_NICE
# container_name: my_very_special_server
ports:
- 3307:3306
environment:
MYSQL_DATABASE: todo
MYSQL_ROOT_PASSWORD: password!
MYSQL_PASSWORD: password!
volumes:
- ./DbScripts/DumpTodoOnly.sql:/docker-entrypoint-initdb.d/DumpTodoOnly.sql
- db_data:/var/lib/mysql
restart: always
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: dev_pma
links:
- mysql
environment:
PMA_HOST: mysql
PMA_PORT: 3307
PMA_ARBITRARY: 1
restart: always
ports:
- 8183:80
server:
container_name: server
build:
context: ./BE
dockerfile: ./Dockerfile.prod
depends_on:
- mysql
environment:
MYSQL_HOST_IP: mysql
ports:
- 4000:4000
links:
- mysql
client:
container_name: FE
build:
context: ./FE
dockerfile: ./Dockerfile.prod
ports:
- 3000:3000
environment:
- CHOKIDAR_USEPOLLING=true
tty: true
volumes:
db_data:
项目结构:
实际的sql文件:
-- 主机:localhost 数据库:todo
-- 服务器版本 8.0.18
/*!40101 设置@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /; /!40101 设置@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /; /!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /; /!50503 设置名称 utf8 /; /!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /; /!40103 设置TIME_ZONE='+00:00' /; /!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /; /!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /; /!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' /; /!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
todos
DROP TABLE IF EXISTS `todos`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `todos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`todotext` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
users
DROP TABLE IF EXISTS `users`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `users` (
`Id` varchar(36) NOT NULL,
`Email` varchar(200) NOT NULL,
`Password` binary(60) NOT NULL,
`ChangedPassword` bit(1) NOT NULL,
`FirstName` varchar(45) NOT NULL,
`LastName` varchar(45) NOT NULL,
`ImageId` varchar(36) DEFAULT NULL,
`SeqRef` varchar(36) DEFAULT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `Email_UNIQUE` (`Email`),
UNIQUE KEY `Id_UNIQUE` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci KEY_BLOCK_SIZE=2;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 设置时区=@OLD_TIME_ZONE */;
/*!40101 设置 SQL_MODE=@OLD_SQL_MODE /; /!40014 设置 FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS /; /!40014 设置 UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS /; /!40101 设置 CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT /; /!40101 设置 CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS /; /!40101 设置 COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION /; /!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- 转储已于2022-03-16 20:20:30完成
当我运行 docker-compose up 时,我看到:
在我的 php 管理中我没有看到任何用户或待办事项表:
我错过了什么?
好吧,当您发帖时找到答案有点不太好,但对于那些有类似问题的人来说:
显然,当您运行 docker-compose up 命令时,数据库配置将被存储并重新启动。为了做到这一点,我必须:
docker-compose down -v
找到答案这里
注意@Sebastiaan Renkens 的回答
Docker 对待绑定挂载(如 ./data 目录)和命名卷(如 db_data 卷)的方式有所不同。绑定挂载本质上是到主机上目录的“链接”,并且不受 Docker 管理,因此您需要手动从 ./data 中删除数据。另一方面,像 db_data 这样的命名卷由 Docker 管理,当您在 docker-compose down 中使用 -v 选项时,它们将被自动删除。