我在使用mysql容器运行初始化脚本时遇到问题。
我有两份档案 create.sql
以及 insert.sql
,我用它初始化数据库。
我使用命令创建图像 docker-compose.yml
它成功运行并创建图像。
我面临两个问题。
当我运行 docker-compose up
命令,mysql容器创建并启动成功。但是两个初始化脚本( create.sql
以及 insert.sql
)不要在数据库上运行。
我明确使用 docker run
命令来运行创建的mysql容器。在这种情况下,初始化脚本将成功运行。
我使用的是DockerVersion18.09.0和DockerComposeVersion1.23.1以及Ubuntu16.04 lts
我是 Docker 的新手,似乎不知道这个问题。
下面是我用来创建图像的文件。 docker-compose.yml
文件。
version: '3'
services:
demo-mysql:
image: demo-mysql
build: ./demo-mysql
volumes:
- /mnt/data/mysql-data:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=demo
- MYSQL_PASSWORD=root
demo-api:
image: demo-api-1.0
build: ./api
depends_on:
- demo-mysql
ports:
- 8080:8080
environment:
- DATABASE_HOST=demo-mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=root
- DATABASE_NAME=demo
- DATABASE_PORT=3306
demo1-app:
image: demo1-app-1.0
build: ./demo1
depends_on:
- demo-mysql
ports:
- 8090:8090
environment:
- DATABASE_HOST=demo-mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=root
- DATABASE_NAME=demo
- DATABASE_PORT=3306
以下是 Dockerfile
对于spring boot项目
FROM java:8
VOLUME /tmp
ARG DATA_PATH=/src/main/resources
ARG APP_PORT=8080
EXPOSE ${APP_PORT}
ADD /build/libs/demo-api.jar demo-api.jar
ENTRYPOINT ["java","-jar","demo-api.jar"]
以下是 Dockerfile
我曾经创建我的mysql图像
FROM mysql:5.7
ENV MYSQL_DATABASE=demo \
MYSQL_USER=root \
MYSQL_ROOT_PASSWORD=root
ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d
EXPOSE 3306
1条答案
按热度按时间gopyfrb31#
来自文档(https://hub.docker.com/_/mysql/)
初始化新示例
当容器第一次启动时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh、.sql和.sql.gz的文件,这些文件位于/docker entrypoint initdb.d中。
我怀疑,因为持续的卷
当docker启动mysql映像时,已经有一个db。所以图像不是“新鲜的”,脚本也没有运行。
更新:我们可以确认这个嫌疑犯正在查看
docker-entrypoint.sh
在这里:https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/5.7/docker-entrypoint.sh脚本仅在
"$DATADIR/mysql"
已不存在。顺便说一句,我个人认为更好的设计是让“应用程序”创建数据库模式、预加载所需的应用程序数据、管理模式迁移等。。。在启动时,这是另一个主题:)