我在mysql方面遇到了类似的问题,我通过docker-compose将本地目录挂载到/docker-entrypoint-initdb.d卷中的/configs/mysql/data,并包含一个mydatabasedump.sql文件。虽然文件被加载到容器中,但在容器初始化时并没有执行或填充数据库。我的初始docker-compose.yml如下:
version: '3'
services:
db:
build: ./build/mysql/
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d:
我发现了两个解决这个问题的方法:
第一个方法是,在我登录正在运行的容器后,确认 mydatabasedump.sq 文件在容器的 docker-entrypoint-initdb.d 目录中存在并且可执行;然后我在本地 /configs/mysql/data 目录下创建并添加了一个名为 dump.sh 的 bash 脚本,该脚本在容器初始化后执行,它包含一个单一的 mysql 命令,将 my_database_dump.sql 复制到 my_app_database 中。bash 脚本看起来像这样:
mysql -uadmin -padmin my_app_database < my_database_dump.sql
我通过 Dockerfile 中的 ENTRYPOINT 指令执行了这个脚本,像这样:
FROM mysql:5.5
ENTRYPOINT [ "dump.sh" ]
EXPOSE 80
在意识到初始问题是由于容器构建后挂载的卷没有初始化数据库,因此无法在启动时使用转储文件(或执行该目录中的任何脚本)之后,第二个解决方案是将我的compose-file中的volumes指令移到构建指令之前。这起作用了,使我能够删除dump.sh脚本和Dockerfile中的DOCKERENTRY指令。修改后的docker-compose.yml如下:
version: '3'
services:
db:
volumes:
- ./configs/mysql/data:/docker-entrypoint-initdb.d
build: ./build/mysql/
container_name: MYSQL_Database
restart: always
environment:
MYSQL_PORT: 3306
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: my_app_database
MYSQL_USER: admin
MYSQL_PASSWORD: admin