fix(Docker): windows improvements and permissions fix (#5444)

This commit is contained in:
Yehonal 2021-04-28 22:26:39 +02:00 committed by GitHub
parent 5954d9c739
commit e4fafc61dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 342 additions and 153 deletions

View File

@ -10,3 +10,4 @@
!/env/docker/etc/worldserver.conf.dockerdist !/env/docker/etc/worldserver.conf.dockerdist
/.env* /.env*
.idea .idea
!.gitkeep

7
.gitattributes vendored
View File

@ -1,10 +1,5 @@
# Auto detect text files and perform LF normalization # Auto detect text files and perform LF normalization
* text=auto * text eol=lf
# End of line rules
*.sh eol=lf
*.sh.dist eol=lf
bin/* eol=lf
# Whitespace rules # Whitespace rules
# strict (no trailing, no tabs) # strict (no trailing, no tabs)

View File

@ -1,11 +0,0 @@
WORLDSERVER_DATA=./docker/worldserver/data
WORLDSERVER_ETC=./docker/worldserver/etc
WORLDSERVER_LOGS=./docker/worldserver/logs
AUTHSERVER_ETC=./docker/authserver/etc
AUTHSERVER_LOGS=./docker/authserver/logs
WORLD_EXTERNAL_PORT=8085
AUTH_EXTERNAL_PORT=3724
DB_EXTERNAL_PORT=9000
DB_ROOT_PASSWORD=password

View File

@ -1,3 +0,0 @@
#!/bin/bash
cp apps/ci/docker/.env.dist .env

View File

@ -1,16 +1,11 @@
function comp_clean() { function comp_clean() {
echo "Cleaning build files" DIRTOCLEAN=${BUILDPATH:-var/build/obj}
PATTERN="$DIRTOCLEAN/*"
CWD=$(pwd) echo "Cleaning build files in $DIRTOCLEAN"
cd $BUILDPATH [ -d "$DIRTOCLEAN" ] && rm -rf $PATTERN
make -f Makefile clean || true
make clean || true
find -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} \+
cd $CWD
} }
function comp_configure() { function comp_configure() {

View File

@ -12,7 +12,7 @@ function dbasm_waitMysqlConn() {
echo "DBASM Timeout: Cannot ping mysql!" 1>&2 echo "DBASM Timeout: Cannot ping mysql!" 1>&2
exit 64 exit 64
fi fi
echo "Cannot ping mysql, retry in $DBASM_WAIT_TIMEOUT seconds (remaining: $COUNT/$DBASM_WAIT_RETRIES)..." echo "Cannot ping mysql on $DBHOST:$DBPORT, retry in $DBASM_WAIT_TIMEOUT seconds (remaining: $COUNT/$DBASM_WAIT_RETRIES)..."
sleep $DBASM_WAIT_TIMEOUT sleep $DBASM_WAIT_TIMEOUT
done done
} }

View File

@ -5,11 +5,12 @@
# #
#================================================================= #=================================================================
FROM ubuntu:20.04 as dev FROM ubuntu:20.04 as base
ARG USER_ID=1000 ARG USER_ID=1000
ARG GROUP_ID=1000 ARG GROUP_ID=1000
ARG DOCKER_USER=acore
LABEL description="AC Worldserver Debug Container for use with Visual Studio" LABEL description="AC base image for dev containers"
# List of timezones: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones # List of timezones: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
@ -21,15 +22,14 @@ ENV TZ=Etc/UTC
# set noninteractive mode so tzdata doesn't ask to set timezone on install # set noninteractive mode so tzdata doesn't ask to set timezone on install
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
# install essentials # Do not use acore dashboard to install
RUN apt-get update && apt-get install -y gdb gdbserver git dos2unix lsb-core sudo curl unzip # since it's not cacheable by docker
RUN apt-get update && apt-get install -y gdb gdbserver git dos2unix lsb-core sudo curl unzip \
# copy everything so we can work directly within the container make cmake clang libmysqlclient-dev libace-dev \
# using tools such as vscode dev-container build-essential libtool cmake-data openssl libgoogle-perftools-dev \
COPY . /azerothcore libssl-dev libmysql++-dev libreadline6-dev zlib1g-dev libbz2-dev mysql-client \
libncurses5-dev ccache \
# install the required dependencies to run the worldserver && rm -rf /var/lib/apt/lists/*
RUN /azerothcore/acore.sh install-deps
# change timezone in container # change timezone in container
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata
@ -40,27 +40,36 @@ RUN addgroup --gid $GROUP_ID acore && \
passwd -d acore && \ passwd -d acore && \
echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
RUN mkdir -p /azerothcore # must be created to set the correct permissions on them
RUN mkdir -p /azerothcore/env/dist/data
RUN mkdir -p /azerothcore/env/dist/logs
RUN mkdir -p /azerothcore/env/dist/etc
RUN mkdir -p /azerothcore/var/build
# Correct permissions for non-root operations # Correct permissions for non-root operations
RUN chown -R acore:acore \ RUN chown -R $DOCKER_USER:$DOCKER_USER /home/acore
/run \ RUN chown -R $DOCKER_USER:$DOCKER_USER /run
/home/acore \ RUN chown -R $DOCKER_USER:$DOCKER_USER /opt
/opt/ \ RUN chown -R $DOCKER_USER:$DOCKER_USER /azerothcore
/azerothcore
USER acore USER $DOCKER_USER
# copy everything so we can work directly within the container
# using tools such as vscode dev-container
# NOTE: this folder is different by the /azerothcore (which is binded instead)
COPY --chown=$DOCKER_USER:$DOCKER_USER . /azerothcore
WORKDIR /azerothcore WORKDIR /azerothcore
#================================================================ #================================================================
# #
# BUILD STAGE: to prepare binaries for the production services # Dev: create dev server image
# #
#================================================================= #=================================================================
FROM dev as build
RUN bash acore.sh compiler build FROM base as dev
LABEL description="AC dev image for dev containers"
#================================================================ #================================================================
# #
@ -70,6 +79,12 @@ RUN bash acore.sh compiler build
FROM ubuntu:20.04 as servicebase FROM ubuntu:20.04 as servicebase
ARG USER_ID=1000
ARG GROUP_ID=1000
ARG DOCKER_USER=acore
LABEL description="AC service image for server applications"
# List of timezones: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones # List of timezones: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
# set timezone environment variable # set timezone environment variable
@ -78,51 +93,105 @@ ENV TZ=Etc/UTC
# set noninteractive mode so tzdata doesn't ask to set timezone on install # set noninteractive mode so tzdata doesn't ask to set timezone on install
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
COPY --from=build /azerothcore/env /azerothcore/env # Create a non-root user
RUN addgroup --gid $GROUP_ID acore && \
adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID acore && \
passwd -d acore && \
echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
# copy the sources from the host machine # install the required dependencies to run the server
COPY apps /azerothcore/apps RUN apt-get update && apt-get install -y dos2unix gdb gdbserver net-tools tzdata libmysqlclient-dev libace-dev mysql-client curl unzip && rm -rf /var/lib/apt/lists/* ;
COPY bin /azerothcore/bin
COPY conf /azerothcore/conf
COPY data /azerothcore/data
COPY deps /azerothcore/deps
COPY acore.json /azerothcore/acore.json
COPY acore.sh /azerothcore/acore.sh
# install the required dependencies to run the authserver
RUN apt-get update && apt-get install -y gdb gdbserver net-tools tzdata libmysqlclient-dev libace-dev mysql-client curl unzip;
# change timezone in container # change timezone in container
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata
# copy the sources from the host machine
COPY --chown=$DOCKER_USER:$DOCKER_USER apps /azerothcore/apps
COPY --chown=$DOCKER_USER:$DOCKER_USER bin /azerothcore/bin
COPY --chown=$DOCKER_USER:$DOCKER_USER conf /azerothcore/conf
COPY --chown=$DOCKER_USER:$DOCKER_USER data /azerothcore/data
COPY --chown=$DOCKER_USER:$DOCKER_USER deps /azerothcore/deps
COPY --chown=$DOCKER_USER:$DOCKER_USER acore.json /azerothcore/acore.json
COPY --chown=$DOCKER_USER:$DOCKER_USER acore.sh /azerothcore/acore.sh
# Correct permissions for non-root operations
RUN chown -R $DOCKER_USER:$DOCKER_USER /home/acore
RUN chown -R $DOCKER_USER:$DOCKER_USER /run
RUN chown -R $DOCKER_USER:$DOCKER_USER /opt
RUN chown $DOCKER_USER:$DOCKER_USER /azerothcore
USER $DOCKER_USER
# must be created to avoid permissions errors
RUN mkdir -p /azerothcore/env/dist/data
RUN mkdir -p /azerothcore/env/dist/logs
RUN mkdir -p /azerothcore/env/dist/etc
RUN mkdir -p /azerothcore/env/dist/bin
WORKDIR /azerothcore/ WORKDIR /azerothcore/
RUN cp -n "/azerothcore/env/docker/etc/worldserver.conf.dockerdist" "/azerothcore/env/dist/etc/worldserver.conf" #================================================================
RUN cp -n "/azerothcore/env/docker/etc/authserver.conf.dockerdist" "/azerothcore/env/dist/etc/authserver.conf" #
# AUTH & WORLD local: images used for local services
# These images don't include binaries by default
#
#=================================================================
FROM servicebase as authserver-local
LABEL description="AC authserver image for local environment"
CMD ./acore.sh run-authserver
FROM servicebase as worldserver-local
LABEL description="AC worldserver image for local environment"
CMD ./acore.sh run-worldserver
#================================================================
#
# BUILD: compile sources
#
#=================================================================
FROM base as build
LABEL description="AC Image used by the build stage to generate production images"
RUN bash bin/acore-docker-build
#================================================================ #================================================================
# #
# AUTH SERVICE: create a ready-to-use authserver image # AUTH SERVICE: create a ready-to-use authserver image
# with binaries included
# #
#================================================================= #=================================================================
FROM authserver-local as authserver
FROM servicebase as authserver LABEL description="AC Production ready authserver"
CMD ./acore.sh run-authserver ARG DOCKER_USER=acore
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/etc /azerothcore/env/dist/etc
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/authserver /azerothcore/env/dist/bin/authserver
#================================================================ #================================================================
# #
# WORLD SERVICE: create a ready-to-use worldserver image # WORLD SERVICE: create a ready-to-use worldserver image
# with binaries and data included
# #
#================================================================= #=================================================================
FROM authserver-local as worldserver
FROM servicebase as worldserver LABEL description="AC Production ready worldserver"
ARG DOCKER_USER=acore
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/etc /azerothcore/env/dist/etc
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/worldserver /azerothcore/env/dist/bin/worldserver
ENV DATAPATH=/azerothcore/env/dist/data ENV DATAPATH=/azerothcore/env/dist/data
RUN /azerothcore/acore.sh client-data RUN /azerothcore/acore.sh client-data
CMD ./acore.sh run-worldserver

View File

@ -7,59 +7,98 @@ import {
const program = new Command(); const program = new Command();
program.name("acore.sh docker") program
.name("acore.sh docker")
.description("Shell scripts for docker") .description("Shell scripts for docker")
.version("1.0.0"); .version("1.0.0");
shellCommandFactory( shellCommandFactory(
"start:app", "start:app",
"Startup the authserver and worldserver apps", "Startup the authserver and worldserver apps",
"docker-compose --profile app up", ["docker-compose --profile app up"],
); );
shellCommandFactory( shellCommandFactory(
"start:app:d", "start:app:d",
"Startup the authserver and worldserver apps in detached mode", "Startup the authserver and worldserver apps in detached mode",
"docker-compose --profile app up -d", ["docker-compose --profile app up -d"],
); );
shellCommandFactory( shellCommandFactory("build", "Build the authserver and worldserver", [
"start:dev", "docker-compose --profile all build",
"Startup the dev server", "docker image prune -f",
"docker-compose --profile dev up", "docker-compose run --rm ac-build bash bin/acore-docker-update",
); ]);
shellCommandFactory(
"build",
"Build the authserver and worldserver",
`docker-compose run --rm ac-dev-server bash bin/acore-docker-build`,
);
shellCommandFactory( shellCommandFactory(
"build:clean", "build:clean",
"Clean build data", "Clean and run build",
`docker-compose run --rm ac-dev-server bash rm -rf var/build`, [
"docker-compose --profile all build",
"docker image prune -f",
`docker-compose run --rm ac-build bash acore.sh compiler clean`,
"docker-compose run --rm ac-build bash bin/acore-docker-update",
],
);
shellCommandFactory(
"build:nocache",
"Build the authserver and worldserver without docker cache",
[
"docker-compose --profile all build --no-cache",
"docker image prune -f",
"docker-compose run --rm ac-build bash bin/acore-docker-update",
],
);
shellCommandFactory(
"build:compile",
"Run the compilation process only, without rebuilding all docker images and importing db",
[
"docker-compose build ac-build",
"docker image prune -f",
"docker-compose run --rm ac-build bash acore.sh compiler build",
],
); );
shellCommandFactory( shellCommandFactory(
"client-data", "client-data",
"Download client data inside the ac-data volume", "Download client data inside the ac-data volume",
"docker-compose run --rm ac-dev-server bash acore.sh client-data", ["docker-compose run --rm ac-worldserver bash acore.sh client-data"],
); );
shellCommandFactory( shellCommandFactory(
"db-import", "db-import",
"Create and upgrade the database with latest updates", "Create and upgrade the database with latest updates",
"docker-compose run --rm ac-dev-server bash acore.sh db-assembler import-all", ["docker-compose run --rm ac-build bash acore.sh db-assembler import-all"],
); );
shellCommandFactory( shellCommandFactory(
"dashboard [args...]", "dev:up",
"Execute acore dashboard within a running ac-dev-server", "Start the dev server container",
"docker-compose exec ac-dev-server bash acore.sh", ["docker-compose up ac-dev-server"],
); );
program.command("attach [service]") 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"],
);
shellCommandFactory(
"dev:dash [args...]",
"Execute acore dashboard within a running ac-dev-server",
["docker-compose run --rm ac-dev-server bash acore.sh"],
);
shellCommandFactory(
"dev:shell [args...]",
"Open an interactive shell within the dev server",
["docker-compose run --rm ac-dev-server bash"],
);
program
.command("attach [service]")
.description("attach to a service") .description("attach to a service")
.action(async (service: string | undefined) => { .action(async (service: string | undefined) => {
const { run } = Deno; const { run } = Deno;
@ -84,6 +123,11 @@ program.command("attach [service]")
let services = new TextDecoder().decode(output).split("\n"); let services = new TextDecoder().decode(output).split("\n");
if (!services) {
console.error("No services available!");
return
}
services.pop(); services.pop();
services = services.slice(2); services = services.slice(2);
@ -99,6 +143,11 @@ program.command("attach [service]")
selService = services[0]; selService = services[0];
} }
if (!selService) {
console.log(`Service ${service} is not available`)
return;
}
command = `docker attach ${selService.split(" ")[0]}`; command = `docker attach ${selService.split(" ")[0]}`;
console.log(ink.colorize(`<green>>>>>> Running: ${command}</green>`)); console.log(ink.colorize(`<green>>>>>> Running: ${command}</green>`));
@ -121,9 +170,12 @@ program.command("attach [service]")
shellCmd.close(); shellCmd.close();
}); });
program.command("quit").description("Close docker command").action(()=> { program
process.exit(0) .command("quit")
}) .description("Close docker command")
.action(() => {
process.exit(0);
});
// Handle it however you like // Handle it however you like
// e.g. display usage // e.g. display usage
@ -133,42 +185,63 @@ while (true) {
const command = await Input.prompt({ const command = await Input.prompt({
message: "Enter the command:", message: "Enter the command:",
}); });
console.log(command)
await program.parseAsync(command.split(" ")); await program.parseAsync(command.split(" "));
} else { } else {
await program.parseAsync(Deno.args); await program.parseAsync(Deno.args);
process.exit(0) process.exit(0);
} }
} }
/**
*
* @param name
* @param description
* @param commands you can pass one or more commands, they will be executed sequentially
* @returns
*/
function shellCommandFactory( function shellCommandFactory(
name: string, name: string,
description: string, description: string,
command: string, commands: string[],
): Command { ): Command {
return program.command(name) return program
.command(name)
.description( .description(
`${description}. Command: \n"${ink.colorize(`<green>${command}</green>`)}"\n`, `${description}. Command: \n"${
ink.colorize(
`<green>${commands.join(" && ")}</green>`,
)
}"\n`,
) )
.action(async (args: any[] | undefined) => { .action(async (args: any[] | undefined) => {
const { run } = Deno; const { run } = Deno;
console.log(ink.colorize(`<green>>>>>> Running: ${command}</green>`)); for (const command of commands) {
console.log(
ink.colorize(`<green>>>>>> Running: ${command}</green>`),
);
const cmd = command.split(" "); const cmd = command.split(" ");
if (Array.isArray(args)) { if (Array.isArray(args)) {
cmd.push(...args); cmd.push(...args);
}
const shellCmd = run({
cmd,
cwd: process.cwd(),
});
const status = await shellCmd.status();
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`);
}
shellCmd.close();
} }
const shellCmd = run({
cmd,
cwd: process.cwd(),
});
await shellCmd.status();
shellCmd.close();
}); });
} }

View File

@ -9,9 +9,9 @@ sudo apt-get update -y
if [[ $DEBIAN_VERSION -eq "10" ]]; then if [[ $DEBIAN_VERSION -eq "10" ]]; then
sudo apt-get install -y git cmake make gcc g++ clang default-libmysqlclient-dev \ sudo apt-get install -y git cmake make gcc g++ clang default-libmysqlclient-dev \
libssl-dev libbz2-dev libreadline-dev libncurses-dev mariadb-server \ libssl-dev libbz2-dev libreadline-dev libncurses-dev mariadb-server \
libace-6.* libace-dev curl unzip libace-6.* libace-dev curl unzip gdb gdbserver
else # Debian 8 and 9 should work using this else # Debian 8 and 9 should work using this
sudo apt-get install -y git cmake make gcc g++ clang libmysqlclient-dev \ sudo apt-get install -y git cmake make gcc g++ clang libmysqlclient-dev \
libssl1.0-dev libbz2-dev libreadline-dev libncurses-dev \ libssl1.0-dev libbz2-dev libreadline-dev libncurses-dev \
mysql-server libace-6.* libace-dev curl unzip mysql-server libace-6.* libace-dev curl unzip gdb gdbserver
fi fi

View File

@ -15,7 +15,7 @@ if [[ $CONTINUOUS_INTEGRATION || $DOCKER ]]; then
libssl-dev libmysql++-dev libreadline6-dev zlib1g-dev libbz2-dev mysql-client \ libssl-dev libmysql++-dev libreadline6-dev zlib1g-dev libbz2-dev mysql-client \
libncurses5-dev ccache curl unzip libncurses5-dev ccache curl unzip
else else
sudo apt-get install -y git gcc g++ \ sudo apt-get install -y git gcc g++ gdb gdbserver \
libssl-dev libbz2-dev libreadline-dev libncurses-dev \ libssl-dev libbz2-dev libreadline-dev libncurses-dev \
mysql-server libace-6.* mysql-server libace-6.*
fi fi

View File

@ -1,15 +1,20 @@
#!/usr/bin/env bash #!/usr/bin/env bash
bash acore.sh compiler build && bash acore.sh db-assembler import-all cd /azerothcore
CUR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" bash acore.sh compiler build
ENV_PATH=$(readlink -f "$CUR_PATH/../env")
echo "Generating confs..." echo "Generating confs..."
cp -n "$ENV_PATH/docker/etc/worldserver.conf.dockerdist" "$ENV_PATH/dist/etc/worldserver.conf" cp -n "env/docker/etc/worldserver.conf.dockerdist" "env/dist/etc/worldserver.conf"
cp -n "$ENV_PATH/docker/etc/authserver.conf.dockerdist" "$ENV_PATH/dist/etc/authserver.conf" cp -n "env/docker/etc/authserver.conf.dockerdist" "env/dist/etc/authserver.conf"
echo "Fixing EOL..." echo "Fixing EOL..."
dos2unix "$ENV_PATH/dist/etc/"* # using -n (new file mode) should also fix the issue
# when the file is created with the default acore user but you
# set a different user into the docker configurations
for file in "env/dist/etc/"*
do
dos2unix -n $file $file
done

7
bin/acore-docker-update Normal file
View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
CUR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$CUR_PATH/acore-docker-build"
bash acore.sh db-assembler import-all

2
conf/dist/config.sh vendored
View File

@ -102,7 +102,7 @@ readarray -td, DATABASES <<<"$DBLIST";
OUTPUT_FOLDER=${OUTPUT_FOLDER:-"$AC_PATH_ROOT/env/dist/sql/"} OUTPUT_FOLDER=${OUTPUT_FOLDER:-"$AC_PATH_ROOT/env/dist/sql/"}
DBASM_WAIT_TIMEOUT=${DBASM_WAIT_TIMEOUT:-1} DBASM_WAIT_TIMEOUT=${DBASM_WAIT_TIMEOUT:-5}
DBASM_WAIT_RETRIES=${DBASM_WAIT_RETRIES:-3} DBASM_WAIT_RETRIES=${DBASM_WAIT_RETRIES:-3}
####### BACKUP ####### BACKUP

24
conf/dist/env.docker vendored
View File

@ -5,19 +5,23 @@
DOCKER_AC_ENV_FILE= DOCKER_AC_ENV_FILE=
DOCKER_DATA=./env/docker/data DOCKER_VOL_DATA=
DOCKER_ETC=./env/docker/etc DOCKER_VOL_ETC=
DOCKER_LOGS=./env/docker/logs DOCKER_VOL_LOGS=
DOCKER_CONF=./conf DOCKER_VOL_CONF=
DOCKER_WORLD_EXTERNAL_PORT=8085 DOCKER_WORLD_EXTERNAL_PORT=
DOCKER_AUTH_EXTERNAL_PORT=3724 DOCKER_SOAP_EXTERNAL_PORT=
DOCKER_DB_EXTERNAL_PORT=3306 DOCKER_AUTH_EXTERNAL_PORT=
DOCKER_DB_ROOT_PASSWORD=password DOCKER_DB_EXTERNAL_PORT=
DOCKER_SOAP_EXTERNAL_PORT=7878 DOCKER_DB_ROOT_PASSWORD=
DOCKER_USER=
DOCKER_USER_ID=
DOCKER_GROUP_ID=
# To maximize the performance on MAC you can change the DOCKER_EXTENDS_BIND variable # To maximize the performance on MAC you can change the DOCKER_EXTENDS_BIND variable
# to "abstract-no-bind", however it won't bind the host directory inside the container. # to "abstract-no-bind", however it won't bind the host directory inside the container.
# It means that you need to work directly within the container using a tool # It means that you need to work directly within the container using a tool
# like the VScode dev-container of the remote-extension suite # like the VScode dev-container of the remote-extension suite
DOCKER_EXTENDS_BIND=abstract-bind DOCKER_EXTENDS_BIND=

View File

@ -27,11 +27,11 @@ services:
# we cannot use /env/dist to avoid permission issues # we cannot use /env/dist to avoid permission issues
- ac-env:/azerothcore/env - ac-env:/azerothcore/env
# expose some dist folder outside allowing the host to use them # expose some dist folder outside allowing the host to use them
- ${DOCKER_CONF:-./conf}:/azerothcore/conf - ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf
- ${DOCKER_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc - ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
- ${DOCKER_DATA:-./env/docker/data}:/azerothcore/env/dist/data:delegated - ${DOCKER_VOL_DATA:-./env/docker/data}:/azerothcore/env/dist/data:delegated
profiles: [abstract-service] # do not run this profiles: [abstract-service] # do not run this
abstract-no-bind: abstract-no-bind:
@ -63,9 +63,9 @@ services:
target: /var/lib/mysql target: /var/lib/mysql
healthcheck: healthcheck:
test: "/usr/bin/mysql --user=root --password=$$MYSQL_ROOT_PASSWORD --execute \"SHOW DATABASES;\"" test: "/usr/bin/mysql --user=root --password=$$MYSQL_ROOT_PASSWORD --execute \"SHOW DATABASES;\""
interval: 2s interval: 5s
timeout: 20s timeout: 10s
retries: 10 retries: 40
ac-worldserver: ac-worldserver:
@ -78,11 +78,19 @@ services:
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore}
privileged: true privileged: true
build: build:
context: . context: .
target: ${DOCKER_BUILD_WORLD_TARGET:-dev} target: ${DOCKER_BUILD_WORLD_TARGET:-worldserver-local}
dockerfile: ./apps/docker/Dockerfile dockerfile: ./apps/docker/Dockerfile
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
cache_from:
- acore/authserver:${DOCKER_IMAGE_TAG:-master}
- acore/dev-server:${DOCKER_IMAGE_TAG:-master}
ports: ports:
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
@ -97,10 +105,18 @@ services:
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore}
build: build:
context: . context: .
target: ${DOCKER_BUILD_AUTH_TARGET:-dev} target: ${DOCKER_BUILD_AUTH_TARGET:-authserver-local}
dockerfile: ./apps/docker/Dockerfile dockerfile: ./apps/docker/Dockerfile
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
cache_from:
- acore/worldserver:${DOCKER_IMAGE_TAG:-master}
- acore/dev-server:${DOCKER_IMAGE_TAG:-master}
ports: ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
profiles: [all, app, authserver] profiles: [all, app, authserver]
@ -110,13 +126,10 @@ services:
# Dev services # Dev services
# #
#====================== #======================
ac-build:
ac-dev-server:
<<: *ac-shared-conf <<: *ac-shared-conf
tty: true extends: ${DOCKER_EXTENDS_BIND:-abstract-bind}
image: acore/dev-server:${DOCKER_IMAGE_TAG:-master} image: acore/dev-server:${DOCKER_IMAGE_TAG:-master}
security_opt:
- seccomp:unconfined
build: build:
context: . context: .
target: dev target: dev
@ -124,9 +137,40 @@ services:
args: args:
USER_ID: ${DOCKER_USER_ID:-1000} USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000} GROUP_ID: ${DOCKER_GROUP_ID:-1000}
extends: ${DOCKER_EXTENDS_BIND:-abstract-bind} DOCKER_USER: ${DOCKER_USER:-acore}
cache_from:
- acore/dev-server:${DOCKER_IMAGE_TAG:-master}
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
working_dir: /azerothcore/
volumes:
- ac-build:/azerothcore/var/build
# use internal copied files instead of volumes
- /azerothcore/src
- /azerothcore/data
- /azerothcore/modules
profiles: [all, build]
ac-dev-server:
<<: *ac-shared-conf
extends: ${DOCKER_EXTENDS_BIND:-abstract-bind}
tty: true
image: acore/dev-server:${DOCKER_IMAGE_TAG:-master}
build:
context: .
target: dev
dockerfile: ./apps/docker/Dockerfile
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
cache_from:
- acore/dev-server:${DOCKER_IMAGE_TAG:-master}
security_opt:
- seccomp:unconfined
env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore}
environment: environment:
DBLIST: AUTH,CHARACTERS,WORLD DBLIST: AUTH,CHARACTERS,WORLD
ports: ports:
@ -134,14 +178,24 @@ services:
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
volumes: volumes:
- ac-build:/azerothcore/var/build - ac-build-dev:/azerothcore/var/build
profiles: [all, dev] profiles: [all, dev]
depends_on:
ac-database:
condition: service_healthy
volumes: volumes:
ac-database: ac-database:
ac-env: ac-env:
ac-build-dev:
ac-build: ac-build:
ac-proj: ac-proj:
# not used, but you can use them by setting
# the DOCKER_VOL_* env variabiles
ac-conf:
ac-etc:
ac-logs:
ac-client-data:
networks: networks:
ac-network: ac-network: