Skip to content

Commit

Permalink
Re-organise mysql scripts so the app runs without root access
Browse files Browse the repository at this point in the history
It works better that way with test containers and in k8s.
  • Loading branch information
dsyer committed Jan 3, 2020
1 parent f9424b5 commit 5d57e0d
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 15 deletions.
5 changes: 4 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ mysql:
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=petclinic
- MYSQL_ROOT_PASSWORD=
- MYSQL_ALLOW_EMPTY_PASSWORD=true
- MYSQL_USER=petclinic
- MYSQL_PASSWORD=petclinic
- MYSQL_DATABASE=petclinic
volumes:
- "./conf.d:/etc/mysql/conf.d:ro"
2 changes: 1 addition & 1 deletion src/main/resources/application-mysql.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# database init, supports mysql too
database=mysql
spring.datasource.url=jdbc:mysql://localhost/petclinic
spring.datasource.username=root
spring.datasource.username=petclinic
spring.datasource.password=petclinic
# SQL is written to be idempotent so this is safe
spring.datasource.initialization-mode=always
8 changes: 5 additions & 3 deletions src/main/resources/db/mysql/petclinic_db_setup_mysql.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@
mysql_1_eedb4818d817 | MySQL init process done. Ready for start up.
...

2) Create the PetClinic database and user by executing the "db/mysql/{schema,data}.sql"
scripts (or set "spring.datasource.initialization-mode=always" the first time you run the app).
2) (Once only) create the PetClinic database and user by executing the "db/mysql/user.sql"
scripts. You can connect to the database running in the docker container using
`mysql -u root -h localhost --protocol tcp`, but you don't need to run the script there
because the petclinic user is already set up if you use the provided `docker-compose.yaml`.

3) Run the app with `spring.profiles.active=mysql` (e.g. as a System property via the command
line, but any way that sets that property in a Spring Boot app should work).

N.B. the "petclinic" database has to exist for the app to work with the JDBC URL value
as it is configured by default. This condition is taken care of by the docker-compose
configuration provided, or by the `schema.sql` if you can run that as root.
configuration provided, or by the `schema.sql` if you can run that as root.
10 changes: 0 additions & 10 deletions src/main/resources/db/mysql/schema.sql
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
CREATE DATABASE IF NOT EXISTS petclinic;

ALTER DATABASE petclinic
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;

GRANT ALL PRIVILEGES ON petclinic.* TO pc@localhost IDENTIFIED BY 'pc';

USE petclinic;

CREATE TABLE IF NOT EXISTS vets (
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(30),
Expand Down
7 changes: 7 additions & 0 deletions src/main/resources/db/mysql/user.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
CREATE DATABASE IF NOT EXISTS petclinic;

ALTER DATABASE petclinic
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;

GRANT ALL PRIVILEGES ON petclinic.* TO 'petclinic@%' IDENTIFIED BY 'petclinic';

0 comments on commit 5d57e0d

Please sign in to comment.