diff options
author | Yehonal <yehonal.azeroth@gmail.com> | 2022-10-17 22:50:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-17 22:50:31 +0200 |
commit | a82cf659a3ea027d0940b1b1622ddfb32c6ba00d (patch) | |
tree | 54d3c3e5c81d50a2e536b3223344315fdd6649bd /apps/docker/docker-cmd.ts | |
parent | 563596bc69ed2feabf76bf5377acf5159f951604 (diff) |
feat(CORE/docker): switch to `docker compose` and check the version (#13444)
* feat(docker): switch to `docker compose` and check the version
* chore: removed all docker-compose commands in CI
Diffstat (limited to 'apps/docker/docker-cmd.ts')
-rw-r--r-- | apps/docker/docker-cmd.ts | 179 |
1 files changed, 110 insertions, 69 deletions
diff --git a/apps/docker/docker-cmd.ts b/apps/docker/docker-cmd.ts index c140cb165f..ce03f34ced 100644 --- a/apps/docker/docker-cmd.ts +++ b/apps/docker/docker-cmd.ts @@ -4,6 +4,7 @@ import { Input, Select, } from "https://deno.land/x/cliffy@v0.25.2/prompt/mod.ts"; +import * as semver from "https://deno.land/std@0.159.0/semver/mod.ts"; const program = new Command(); @@ -13,6 +14,8 @@ const env = { BUILDKIT_INLINE_CACHE: "1", }; +const MIN_COMPOSE_VERSION = "2.0.0"; + program .name("acore.sh docker") .description("Shell scripts for docker") @@ -21,43 +24,48 @@ program shellCommandFactory( "start:app", "Startup the authserver and worldserver apps", - ["docker-compose --profile app up"], - env, + ["docker compose --profile app up"], + env ); shellCommandFactory( "start:app:d", "Startup the authserver and worldserver apps in detached mode", - ["docker-compose --profile app up -d"], - env, + ["docker compose --profile app up -d"], + env ); -shellCommandFactory("build", "Build the authserver and worldserver", [ - "docker-compose --profile local build --parallel", - "docker image prune -f", - "docker-compose run --rm ac-build bash apps/docker/docker-build-dev.sh", -], env); +shellCommandFactory( + "build", + "Build the authserver and worldserver", + [ + "docker compose --profile local build --parallel", + "docker image prune -f", + "docker compose run --rm ac-build bash apps/docker/docker-build-dev.sh", + ], + env +); shellCommandFactory( "build:nocache", "Build the authserver and worldserver without docker cache", [ - "docker-compose --profile local build --no-cache --parallel", + "docker compose --profile local build --no-cache --parallel", "docker image prune -f", - "docker-compose run --rm ac-build bash apps/docker/docker-build-dev.sh", + "docker compose run --rm ac-build bash apps/docker/docker-build-dev.sh", ], - env, + env ); shellCommandFactory( "build:compile", "Run the compilation process only, without rebuilding all docker images", [ - "docker-compose build --parallel ac-build", + "docker compose build --parallel ac-build", "docker image prune -f", - "docker-compose run --rm ac-build bash apps/docker/docker-build-dev.sh", + "docker compose run --rm ac-build bash apps/docker/docker-build-dev.sh", ], - env, + env ); shellCommandFactory( @@ -65,78 +73,75 @@ shellCommandFactory( "Clean build files", [ "docker image prune -f", - `docker-compose run --rm ac-build bash acore.sh compiler clean`, + `docker compose run --rm ac-build bash acore.sh compiler clean`, ], - env, + env ); shellCommandFactory( "client-data", "Download client data inside the ac-data volume", - ["docker-compose run --rm ac-build bash acore.sh client-data"], - env, + ["docker compose run --rm ac-build bash acore.sh client-data"], + env ); shellCommandFactory( "dev:up", "Start the dev server container in background", - ["docker-compose up -d ac-dev-server"], - env, + ["docker compose up -d ac-dev-server"], + env ); shellCommandFactory( "dev:build", "Build using the dev server, it uses volumes to compile which can be faster on linux & WSL", - ["docker-compose run --rm ac-dev-server bash acore.sh compiler build"], - env, + ["docker compose run --rm ac-dev-server bash acore.sh compiler build"], + env ); shellCommandFactory( "dev:dash [args...]", "Execute acore dashboard within a running ac-dev-server", - ["docker-compose run --rm ac-dev-server bash acore.sh"], - env, + ["docker compose run --rm ac-dev-server bash acore.sh"], + env ); shellCommandFactory( "dev:shell [args...]", "Open an interactive shell within the dev server", [ - "docker-compose up -d ac-dev-server", - "docker-compose exec ac-dev-server bash", + "docker compose up -d ac-dev-server", + "docker compose exec ac-dev-server bash", ], - env, + env ); shellCommandFactory( "prod:build", "Build producion services", - [ - "docker-compose --profile prod build --parallel", - "docker image prune -f", - ], - env, + ["docker compose --profile prod build --parallel", "docker image prune -f"], + env ); shellCommandFactory( "prod:pull", "Pull production services from the remote registry", - ["docker-compose --profile prod pull"], - env, + ["docker compose --profile prod pull"], + env ); shellCommandFactory( "prod:up", "Start production services (foreground)", - ["docker-compose --profile prod-app up"], - env, + ["docker compose --profile prod-app up"], + env ); shellCommandFactory( "prod:up:d", "Start production services (background)", - ["docker-compose --profile prod-app up -d"], - env, + ["docker compose --profile prod-app up -d"], + env ); program @@ -145,7 +150,7 @@ program .action(async (service: string | undefined) => { const { run } = Deno; - let command = `docker-compose ps`; + let command = `docker compose ps`; if (service) { command = `${command} ${service}`; @@ -196,8 +201,8 @@ program console.log( ink.colorize( - "<yellow>NOTE: you can detach from a container and leave it running using the CTRL-p CTRL-q key sequence.</yellow>", - ), + "<yellow>NOTE: you can detach from a container and leave it running using the CTRL-p CTRL-q key sequence.</yellow>" + ) ); cmd = command.split(" "); @@ -219,22 +224,6 @@ program process.exit(0); }); -// Handle it however you like -// e.g. display usage -while (true) { - if (Deno.args.length === 0) { - program.outputHelp(); - const command = await Input.prompt({ - message: "Enter the command:", - }); - console.log(command); - await program.parseAsync(command.split(" ")); - } else { - await program.parseAsync(Deno.args); - process.exit(0); - } -} - /** * * @param name @@ -246,24 +235,20 @@ function shellCommandFactory( name: string, description: string, commands: string[], - env?: { [key: string]: string }, + env?: { [key: string]: string } ): Command { return program .command(name) .description( - `${description}. Command: \n"${ - ink.colorize( - `<green>${commands.join(" && ")}</green>`, - ) - }"\n`, + `${description}. Command: \n"${ink.colorize( + `<green>${commands.join(" && ")}</green>` + )}"\n` ) .action(async (args: string[] | undefined) => { const { run } = Deno; for (const command of commands) { - console.log( - ink.colorize(`<green>>>>>> Running: ${command}</green>`), - ); + console.log(ink.colorize(`<green>>>>>> Running: ${command}</green>`)); const cmd = command.split(" "); @@ -281,11 +266,67 @@ function shellCommandFactory( if (!status.success) { throw new Error(`Failed with error: ${status.code}, however, - it's not related to this Deno script directly. An error occurred within - the script called by the command itself`); + it's not related to this Deno script directly. An error occurred within + the script called by the command itself`); } shellCmd.close(); } }); } + +async function checkDockerVersion() { + const { run } = Deno; + const dockerVerCmd = run({ + cmd: ["docker", "compose", "version"], + cwd: process.cwd(), + env: { ...process.env, ...env }, + stdout: "piped", + }); + + const output = await dockerVerCmd.output(); + const status = await dockerVerCmd.status(); + const outStr = new TextDecoder().decode(output); + + if (!status.success) { + return 'not installed?' + } + + const version = outStr.split(" ").pop()?.trim(); + + if (!version) return version; + + if (!semver.gte(version, MIN_COMPOSE_VERSION)) { + return version; + } + + return true; +} + +async function main() { + // Handle it however you like + // e.g. display usage + while (true) { + const version = await checkDockerVersion(); + if (version !== true) { + console.error( + ink.colorize(`<red>ERROR: Your docker compose version (${version}) must be higher or equal to ${MIN_COMPOSE_VERSION}. Please install the new version of docker compose and try again</red>`) + ); + return false + } + + if (Deno.args.length === 0) { + program.outputHelp(); + const command = await Input.prompt({ + message: "Enter the command:", + }); + console.log(command); + await program.parseAsync(command.split(" ")); + } else { + await program.parseAsync(Deno.args); + process.exit(0); + } + } +} + +main(); |