MySQL scripts in docker-entrypoint-initdb are not executed
I had the exact same issue with the mariadb image (version: 10.4) and I solved it by making sure my container data volume is empty from any files or directories when I create the container from scratch.
This is my docker compose file:
mariadb: image: mariadb:10.4 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ******** volumes: - ./storage/db:/var/lib/mysql:rw - ./app/db/SQL:/docker-entrypoint-initdb.d/:rw ports: - 3306:3306/tcp
For me I just had to make sure this path: './storage/db' is empty from files. Please notice that the directory has to exists but be empty.
So I had the same issue for hours, and then decided to look into docker-entrypoint.sh. It turns out that the script checks for $DATADIR/mysql, typical /var/lib/mysql and skips the rest of the code if the datadir exists, incl. docker-entrypoint-initdb.d
So what I did was make a simple init.sh file to remove the datadir then start docker.
docker-compose.yml:
volumes:
- ./docker/mysql/scripts:/docker-entrypoint-initdb.d
- ./mysql_data:/var/lib/mysql
init.sh:
#!/bin/bash
rm -rf mysql_data
docker-compose up --force-recreate
And of course add -d
to docker-compose
once I see it works as expected.
You should clear data_volume
before run the container and the sql files will be executed. This volume data_volume
can be removed by using command: docker volume rm data_volume
.
The root cause of your problem can be found in docker-entrypoint.sh
. When you run a mysql container, it checks mysql directory /var/lib/mysql
exist or not.
If the directory doesn't exist (run it first time), it will run your SQL files.
if [ ! -d "$DATADIR/mysql" ]; then
//Some other logic here
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.sql) echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;;
*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
You can get more details at Dockerfile source