I am trying to set up a mysql docker container and execute init sql script. Unfortunately the sql script is not executed. What am I doing wrong?
version: '3.3'
services:
api:
container_name: 'api'
build: './api'
ports:
- target: 8080
published: 8888
protocol: tcp
mode: host
volumes:
- './api:/go/src/app'
depends_on:
- 'mysql'
mysql:
image: 'mysql:latest'
container_name: 'mysql'
volumes:
- ./db_data:/var/lib/mysql:rw
- ./database/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
restart: always
environment:
MYSQL_USER: test
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: test
ports:
- '3306:3306'
volumes:
db_data:
I execute file with docker-compose up -d --build
Many containerized applications, especially stateful ones, have a way of running
init
scripts (like the sql scripts here) and they are supposed to run only once.And since they are stateful, the volumes are a source of truth for the containers on whether to run the
init
scripts or not on container restart.Like in your case, deleting the folder used for bind mount or using a new named volume should re-run any
init
scripts present.The
docker-entrypoint-initdb.d
folder will only be run once while the container is created (instantiated) so you actually have to do adocker-compose down -v
to re-activate this for the next run.If you want to be able to add sql files at any moment you can look here at a specialized MySql docker image... https://github.com/IvoNet/ivonet-docker-images/tree/master/databases/mysql
Hope it helps