我在使用 mysql 容器运行我的初始化脚本时遇到问题。
我有两个文件 create.sql
和 insert.sql
,我用它们来初始化数据库.
我使用命令 docker-compose.yml
创建图像,它成功运行并创建了图像。
我面临两个问题。
当我运行
docker-compose up
命令时,成功创建并启动了 mysql 容器。但是,两个初始化脚本(create.sql
和insert.sql
)不会在数据库上运行。我明确使用
docker run
命令来运行创建的 mysql 容器。在这种情况下,初始化脚本运行成功。
我正在使用 Docker 版本 18.09.0 和 docker-compose 版本 1.23.1 和 ubuntu < strong>16.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
下面是spring boot项目的Dockerfile
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"]
以下是我用来创建mysql镜像的Dockerfile
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
最佳答案
来自文档 ( https://hub.docker.com/_/mysql/ )
Initializing a fresh instance
When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d.
我怀疑是因为持久化的体积
volumes:
- /mnt/data/mysql-data:/var/lib/mysql
docker启动mysql镜像时,已经有一个DB了。所以图像不是“新鲜的”,脚本也没有运行。
更新:
我们可以在此处查看 docker-entrypoint.sh
的源代码来确认这个嫌疑人:https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/5.7/docker-entrypoint.sh
if [ ! -d "$DATADIR/mysql" ]; then
...
...
ls /docker-entrypoint-initdb.d/ > /dev/null
for f in /docker-entrypoint-initdb.d/*; do
process_init_file "$f" "${mysql[@]}"
done
脚本仅在 "$DATADIR/mysql"
不存在时运行。
顺便说一句,我个人认为更好的设计是让“应用程序”创建数据库模式、预加载所需的应用程序数据、管理模式迁移等...在启动时,但这是另一个主题:)
关于mysql - Docker 撰写 MySql 初始化脚本不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407147/