Adding Flyway to a MySQL Docker Container
services:# Standard Mysql Box, we have to add tricky things else logging by workbench is hardsupermonk-mysql: image: mysql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci environment: - MYSQL_ROOT_PASSWORD=P@ssw0rd - MYSQL_ROOT_HOST=% - MYSQL_DATABASE=test ports: - "3306:3306" healthcheck: test: ["CMD-SHELL", "nc -z 127.0.0.1 3306 || exit 1"] interval: 1m30s timeout: 60s retries: 6# Flyway is best for mysql schema migration history.supermonk-flyway: container_name: supermonk-flyway image: boxfuse/flyway command: -url=jdbc:mysql://supermonk-mysql:3306/test?verifyServerCertificate=false&useSSL=true -schemas=test -user=root -password=P@ssw0rd migrate volumes: - "./sql:/flyway/sql" depends_on: - supermonk-mysql
mkdir ./sqlvi ./sql/V1.1__Init.sql # and paste below
CREATE TABLE IF NOT EXISTS test.USER (id VARCHAR(64),fname VARCHAR(256),lname VARCHAR(256),CONSTRAINT pk PRIMARY KEY (id));
save and close
docker-compose up -d
wait for 2 minutes
docker-compose run supermonk-flyway
Ref :
- https://github.com/supermonk/webapp/tree/branch-1/docker/docker-database
- Thanks to docker community and mysql community
- docker-compose logs -f
I mean it's the good way to start from the ready image (for start).
You may start from image docker "mysql"
FROM mysql
If you start the finished image - when creating new version your docker then will only update the difference.
Next, step you may install java and net-tools
RUN apt-get -y install apt-utils openjdk-8-jdk net-tools
Config mysql
ENV MYSQL_DATABASE=mydbENV MYSQL_ROOT_PASSWORD=root
Add flyway
ADD flyway /opt/flyway
Add migrations
ADD sql /opt/flyway/sql
Add config flyway
ADD config /opt/flyway/conf
Add script to start
ADD start /root/start.sh
Check start mysql
RUN netstat -ntlp
Check java version
RUN java -version
Example file: /opt/flyway/conf/flyway.conf
flyway.driver=com.mysql.jdbc.Driverflyway.url=jdbc:mysql://localhost:3306/mydbflyway.user=rootflyway.password=root
Example file: start.sh
#!/bin/bashcd /opt/flywayflyway migrate# may change to start.sh to start product migration or development.
I mean that you in next step may use flyway as service:
For example:
docker run -it -p 3307:3306 my_docker_flyway /root/start << migration_prod.shdocker run -it -p 3308:3306 my_docker_flayway /root/start << migration_dev.sh
etc ...