From 90687007f5c1f67b04a005c1a730db34217bd338 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 3 Apr 2021 14:59:37 +0200 Subject: [PATCH] Rework Docker support - Use multi-stage build for the application image - Utilize connection pool init timeout for waiting on database container startup, "docker-compose-wait" dependency is no longer required - Override database host through environment variable - used in docker-compose - Rename database scripts for explicit ordering (db container loads them alphabetically) --- .dockerignore | 3 +++ .gitignore | 1 + Dockerfile | 27 ++++++++++++------- config.yaml | 3 ++- docker-compose.yml | 16 ++++++----- sql/{db_database.sql => 1-db_database.sql} | 0 sql/{db_drops.sql => 2-db_drops.sql} | 0 ...{db_shopupdate.sql => 3-db_shopupdate.sql} | 0 src/main/java/config/ServerConfig.java | 3 ++- src/main/java/tools/DatabaseConnection.java | 11 +++++++- 10 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 .dockerignore rename sql/{db_database.sql => 1-db_database.sql} (100%) rename sql/{db_drops.sql => 2-db_drops.sql} (100%) rename sql/{db_shopupdate.sql => 3-db_shopupdate.sql} (100%) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..3fbb8c079e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +/docs +/handbook +/tools \ No newline at end of file diff --git a/.gitignore b/.gitignore index 99c411b1fa..d13e4644ed 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .idea/ *.iml /target +/docker-db-data # build files diff --git a/Dockerfile b/Dockerfile index d37cf08b8e..b24fea224d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,20 @@ -# Docker support, thanks to xinyifly +# Initial Docker support thanks to xinyifly -FROM openjdk:8u171-jdk-alpine -RUN apk -U add tini -WORKDIR /mnt +# +# Build stage +# +FROM maven:3.6.3-jdk-8 AS build +COPY src /home/app/src +COPY pom.xml /home/app +RUN mvn -f /home/app/pom.xml clean package + +# +# Package stage +# +FROM openjdk:8 +COPY --from=build /home/app/target/Cosmic.jar /usr/local/lib/Cosmic.jar COPY ./ ./ -RUN sh ./posix-compile.sh -ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.6.0/wait /wait -RUN chmod +x /wait - EXPOSE 8484 7575 7576 7577 -ENTRYPOINT ["tini", "--"] -CMD /wait && sh ./posix-launch.sh +ENTRYPOINT ["java", "-jar", "/usr/local/lib/Cosmic.jar"] + + diff --git a/config.yaml b/config.yaml index b53999d5b0..4caedb49ea 100644 --- a/config.yaml +++ b/config.yaml @@ -162,7 +162,8 @@ server: USE_THREAD_TRACKER: false #[SEVERE] This deadlock auditing thing will bloat the memory as fast as the time frame one takes to lose track of a raindrop on a tempesting day. Only for debugging purposes. #Database Configuration - DB_URL: "jdbc:mysql://localhost:3306/cosmic" + DB_URL_FORMAT: "jdbc:mysql://%s:3306/cosmic" + DB_HOST: "localhost" DB_USER: "cosmic_server" DB_PASS: "snailshell" INIT_CONNECTION_POOL_TIMEOUT: 60 # Seconds diff --git a/docker-compose.yml b/docker-compose.yml index eb87edac6b..fc7334dedd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,20 +1,22 @@ version: '3' services: maplestory: - network_mode: "host" build: . depends_on: - db + ports: + - "8484:8484" + - "7575-7577:7575-7577" environment: - WAIT_HOSTS: localhost:3306 + DB_HOST: "db" db: - network_mode: "host" - image: mysql:5.6 + image: mysql:8.0.23 environment: - MYSQL_ALLOW_EMPTY_PASSWORD: "yes" + MYSQL_RANDOM_ROOT_PASSWORD: "true" MYSQL_DATABASE: "cosmic" - MYSQL_USER: "root" - MYSQL_PASSWORD: "" + MYSQL_USER: "cosmic_server" + MYSQL_PASSWORD: "snailshell" volumes: + - ./docker-db-data:/var/lib/mysql - ./sql:/docker-entrypoint-initdb.d diff --git a/sql/db_database.sql b/sql/1-db_database.sql similarity index 100% rename from sql/db_database.sql rename to sql/1-db_database.sql diff --git a/sql/db_drops.sql b/sql/2-db_drops.sql similarity index 100% rename from sql/db_drops.sql rename to sql/2-db_drops.sql diff --git a/sql/db_shopupdate.sql b/sql/3-db_shopupdate.sql similarity index 100% rename from sql/db_shopupdate.sql rename to sql/3-db_shopupdate.sql diff --git a/src/main/java/config/ServerConfig.java b/src/main/java/config/ServerConfig.java index df37b3d8b0..721c577e16 100644 --- a/src/main/java/config/ServerConfig.java +++ b/src/main/java/config/ServerConfig.java @@ -5,7 +5,8 @@ public class ServerConfig { public boolean USE_THREAD_TRACKER; //Database Configuration - public String DB_URL; + public String DB_URL_FORMAT; + public String DB_HOST; public String DB_USER; public String DB_PASS; public int INIT_CONNECTION_POOL_TIMEOUT; diff --git a/src/main/java/tools/DatabaseConnection.java b/src/main/java/tools/DatabaseConnection.java index 3901a3ab65..875bf7ef44 100644 --- a/src/main/java/tools/DatabaseConnection.java +++ b/src/main/java/tools/DatabaseConnection.java @@ -27,10 +27,19 @@ public class DatabaseConnection { return dataSource.getConnection(); } + private static String getDbUrl() { + // Environment variables override what's defined in the config file + // This feature is used for the Docker support + String hostOverride = System.getenv("DB_HOST"); + String host = hostOverride != null ? hostOverride : YamlConfig.config.server.DB_HOST; + String dbUrl = String.format(YamlConfig.config.server.DB_URL_FORMAT, host); + return dbUrl; + } + private static HikariConfig getConfig() { HikariConfig config = new HikariConfig(); - config.setJdbcUrl(YamlConfig.config.server.DB_URL); + config.setJdbcUrl(getDbUrl()); config.setUsername(YamlConfig.config.server.DB_USER); config.setPassword(YamlConfig.config.server.DB_PASS);