diff options
author | Mike Delago <32778141+michaeldelago@users.noreply.github.com> | 2023-10-15 08:47:09 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-15 17:47:09 +0200 |
commit | c4dc20a814451a27aef8113e829809a2b6587e3b (patch) | |
tree | a7480e17d2fdaa24eb71433d5efcd546a43bc20e | |
parent | d1d46074a6d959d03c54de584db96e893cd0b5c4 (diff) |
refactor(Docker): remove prod container distinction (#17419)
* refactor(Docker): remove prod containers
* workflows: use buildx
* properly set tags
* comment in Dockerfile
* set docker build context
* minor CI changes
* CI: docker build args shouldnt have quotes
* CI: using matrix and caching is too much work
* CI: I hate yaml
* CI: It was a typo
* CI: extra build removed
* CI: appease the linter
* fixup! CI: appease the linter
* fixup! CI: appease the linter
* apps: docker: remove extraneous files
-rw-r--r-- | .github/actions/docker-tag-and-build/action.yml | 38 | ||||
-rw-r--r-- | .github/workflows/docker_build.yml | 190 | ||||
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | apps/docker/Dockerfile | 479 | ||||
-rw-r--r-- | apps/docker/Dockerfile.dev-server | 83 | ||||
-rw-r--r-- | apps/docker/README.md | 40 | ||||
-rw-r--r-- | apps/docker/config-docker.sh | 8 | ||||
-rw-r--r-- | apps/docker/docker-build-dev.sh | 14 | ||||
-rwxr-xr-x | apps/docker/docker-build-prod.sh | 5 | ||||
-rw-r--r-- | apps/docker/docker-cmd.sh | 74 | ||||
-rw-r--r-- | apps/docker/entrypoint.sh | 22 | ||||
-rw-r--r-- | docker-compose.yml | 400 |
12 files changed, 599 insertions, 757 deletions
diff --git a/.github/actions/docker-tag-and-build/action.yml b/.github/actions/docker-tag-and-build/action.yml new file mode 100644 index 0000000000..6a37cb53a1 --- /dev/null +++ b/.github/actions/docker-tag-and-build/action.yml @@ -0,0 +1,38 @@ +name: docker tag and build +description: a helper action to shorten generating docker tags and building +inputs: + component-name: + description: name of the component/docker image (eg worldserver, authserver) + type: string + required: true + push: + description: whether to push the image or not + type: boolean + required: true + version: + description: version tag to use for docker image + required: true + type: string +runs: + using: composite + steps: + - name: Get Docker Metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: acore/ac-wotlk-${{ inputs.component-name }} + tags: | + type=raw,value=${{ inputs.version }} + type=ref,event=branch + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: ${{ github.workspace }} + file: apps/docker/Dockerfile + push: ${{ inputs.push }} + tags: ${{ steps.meta.outputs.tags }} + build-args: | + USER_ID=1000 + GROUP_ID=1000 + DOCKER_USER=acore diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 2dfc535eba..b3a9822cb2 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -4,7 +4,11 @@ on: branches: - 'master' pull_request: - types: ['labeled', 'opened', 'synchronize', 'reopened'] + types: + - labeled + - opened + - synchronize + - reopened concurrency: group: ${{ github.head_ref }} || concat(${{ github.ref }}, ${{ github.workflow }}) @@ -12,41 +16,24 @@ concurrency: jobs: docker-build-n-deploy-dev: - strategy: - fail-fast: true - matrix: - os: [ubuntu-20.04] - runs-on: ${{ matrix.os }} + runs-on: "ubuntu-latest" if: | github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft - && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') + && (github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') env: COMPOSE_DOCKER_CLI_BUILD: 1 DOCKER_BUILDKIT: 1 steps: - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - id: extract_branch - - - name: Configure + - name: Free up disk space run: | sudo rm -rf /usr/local/lib/android sudo rm -rf /usr/share/dotnet sudo rm -rf /opt/ghc sudo rm -rf "$AGENT_TOOLSDIRECTORY" - docker --version - docker compose version - uses: actions/checkout@v4 - # we need the entire history for the ac-dev-server - # with: - # fetch-depth: 2 - - # - name: Set up Docker Buildx - # uses: docker/setup-buildx-action@v1 - name: Login to Docker Hub if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' @@ -55,123 +42,116 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build Dev - if: github.repository == 'azerothcore/azerothcore-wotlk' - env: - #DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }} - DOCKER_CLIENT_TIMEOUT: 400 - COMPOSE_HTTP_TIMEOUT: 400 - run: | - export DOCKER_USER_ID=$(id -u) - export DOCKER_GROUP_ID=$(id -u) - # pull the images first to load the docker cache layers - #./acore.sh docker pull - ./acore.sh docker build - output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "} - DOCKER_IMAGE_TAG=$version docker compose --profile dev --profile local build - - - name: Deploy Dev - #env: - # DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }} - if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' + - name: Get version + id: version run: | - docker compose --profile dev --profile local push - output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "} - DOCKER_IMAGE_TAG=$version docker compose --profile dev --profile local push + output=$(./acore.sh version | grep "AzerothCore Rev. ") + version=${output#"AzerothCore Rev. "} + echo "version=$version" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: acore/ac-wotlk-dev-server + tags: | + type=raw,value=${{ steps.version.outputs.version }} + type=ref,event=branch + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: ${{ github.workspace }} + file: apps/docker/Dockerfile.dev-server + push: ${{ github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' }} + tags: ${{ steps.meta.outputs.tags }} + build-args: | + USER_ID=1000 + GROUP_ID=1000 + DOCKER_USER=acore + + # TODO: rename this job docker-build-n-deploy-prod: - strategy: - fail-fast: true - matrix: - os: [ubuntu-20.04] - runs-on: ${{ matrix.os }} + runs-on: "ubuntu-latest" if: | github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft - && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') + && (github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') env: COMPOSE_DOCKER_CLI_BUILD: 1 DOCKER_BUILDKIT: 1 steps: - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - id: extract_branch - - - name: Configure + - name: Free up disk space run: | sudo rm -rf /usr/local/lib/android sudo rm -rf /usr/share/dotnet sudo rm -rf /opt/ghc sudo rm -rf "$AGENT_TOOLSDIRECTORY" - docker --version - docker compose version - uses: actions/checkout@v4 - # we need the entire history for the ac-dev-server - # with: - # fetch-depth: 2 - - # - name: Set up Docker Buildx - # uses: docker/setup-buildx-action@v1 - name: Login to Docker Hub - if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' + if: github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Cache - uses: actions/cache@v3 - with: - path: var/docker/ccache - key: ccache:${{ matrix.os }}:clang:without-modules:${{ github.ref }}:${{ github.sha }} - restore-keys: | - ccache:${{ matrix.os }}:clang:without-modules:${{ github.ref }} - ccache:${{ matrix.os }}:clang:without-modules - - - name: Build Production images - if: github.repository == 'azerothcore/azerothcore-wotlk' - env: - #DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }} - DOCKER_CLIENT_TIMEOUT: 220 - COMPOSE_HTTP_TIMEOUT: 220 - run: | - export DOCKER_USER_ID=$(id -u) - export DOCKER_GROUP_ID=$(id -u) - # pull the images first to load the docker cache layers - #./acore.sh docker prod:pull - ./acore.sh docker prod:build - output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "} - DOCKER_IMAGE_TAG=$version ./acore.sh docker prod:build - # create the container to allow the copy right after - docker compose create ac-build-prod - docker compose cp ac-build-prod:/azerothcore/var/ccache var/docker/ - echo "ccache exported" - - - name: Deploy Production images - #env: - # DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }} - if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' + - name: Get version + id: version run: | - docker compose --profile prod push - output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "} - DOCKER_IMAGE_TAG=$version docker compose --profile prod push + output=$(./acore.sh version | grep "AzerothCore Rev. ") + version=${output#"AzerothCore Rev. "} + echo "version=$version" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: build worldserver + uses: ./.github/actions/docker-tag-and-build + with: + component-name: worldserver + version: ${{ steps.version.outputs.version }} + push: ${{ github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' }} + - name: build authserver + uses: ./.github/actions/docker-tag-and-build + with: + component-name: authserver + version: ${{ steps.version.outputs.version }} + push: ${{ github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' }} + + - name: build db-import + uses: ./.github/actions/docker-tag-and-build + with: + component-name: db-import + version: ${{ steps.version.outputs.version }} + push: ${{ github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' }} + + - name: build client-data + uses: ./.github/actions/docker-tag-and-build + with: + component-name: client-data + version: ${{ steps.version.outputs.version }} + push: ${{ github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' }} + + - name: build tools + uses: ./.github/actions/docker-tag-and-build + with: + component-name: tools + version: ${{ steps.version.outputs.version }} + push: ${{ github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' }} dispatch-acore-docker: needs: [ docker-build-n-deploy-prod , docker-build-n-deploy-dev] runs-on: ubuntu-latest steps: - - name: Extract branch name - shell: bash - run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - id: extract_branch - - name: Repository Dispatch - if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' + if: github.repository == 'azerothcore/azerothcore-wotlk' && github.ref_name == 'master' uses: peter-evans/repository-dispatch@v2 with: token: ${{ secrets.ACORE_DOCKER_REPO_ACCESS_TOKEN }} diff --git a/.gitignore b/.gitignore index e9f55da770..92e08b0b14 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,8 @@ /src/server/scripts/Custom/* !/src/server/scripts/Custom/README.md -/docker-compose.override.yml +/*.override.yml +/*.override.yaml !.gitkeep diff --git a/apps/docker/Dockerfile b/apps/docker/Dockerfile index 358a7b2a9f..6164326072 100644 --- a/apps/docker/Dockerfile +++ b/apps/docker/Dockerfile @@ -1,344 +1,255 @@ -#syntax=docker/dockerfile:1.2 - -#================================================================ -# -# DEV: Stage used for the development environment -# and the locally built services -# -#================================================================= - -FROM ubuntu:20.04 as base -ARG USER_ID=1000 -ARG GROUP_ID=1000 -ARG DOCKER_USER=acore - -LABEL description="AC base image for dev containers" - -# List of timezones: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones - -ENV DOCKER=1 - -# Ensure ac-dev-server can properly pull versions -ENV GIT_DISCOVERY_ACROSS_FILESYSTEM=1 - -# set timezone environment variable -ENV TZ=Etc/UTC - -# set noninteractive mode so tzdata doesn't ask to set timezone on install -ENV DEBIAN_FRONTEND=noninteractive - -# Do not use acore dashboard to install -# since it's not cacheable by docker -RUN apt-get update && apt-get install -y gdb gdbserver git dos2unix lsb-core sudo curl unzip \ - make cmake clang libmysqlclient-dev \ - libboost-system1.7*-dev libboost-filesystem1.7*-dev libboost-program-options1.7*-dev libboost-iostreams1.7*-dev \ - build-essential libtool cmake-data openssl libgoogle-perftools-dev google-perftools \ - libssl-dev libmysql++-dev libreadline6-dev zlib1g-dev libbz2-dev mysql-client \ - libncurses5-dev ccache \ - && rm -rf /var/lib/apt/lists/* - -# Ensure git will work with the AzerothCore source directory -RUN git config --global --add safe.directory /azerothcore - -# change timezone in container -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata - -# Create a non-root user -RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \ - adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \ - passwd -d "$DOCKER_USER" && \ - echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers - -# must be created to set the correct permissions on them -RUN mkdir -p /azerothcore/env/dist/bin -RUN mkdir -p /azerothcore/env/dist/data/Cameras -RUN mkdir -p /azerothcore/env/dist/data/dbc -RUN mkdir -p /azerothcore/env/dist/data/maps -RUN mkdir -p /azerothcore/env/dist/data/mmaps -RUN mkdir -p /azerothcore/env/dist/data/vmaps -RUN mkdir -p /azerothcore/env/dist/logs -RUN mkdir -p /azerothcore/env/dist/temp -RUN mkdir -p /azerothcore/env/dist/etc -RUN mkdir -p /azerothcore/var/build/obj - -# 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 -R $DOCKER_USER:$DOCKER_USER /azerothcore - -USER $DOCKER_USER - -# copy only necessary files for the acore dashboard -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 - -# Download deno and make sure the dashboard works -RUN bash /azerothcore/acore.sh quit +ARG UBUNTU_VERSION=22.04 # lts +ARG TZ=Etc/UTC + +# This target lays out the general directory skeleton for AzerothCore, +# This target isn't intended to be directly used +FROM ubuntu:$UBUNTU_VERSION as skeleton + +ARG DOCKER=1 +ARG DEBIAN_FRONTEND=noninteractive + +ENV TZ=$TZ +ENV AC_FORCE_CREATE_DB=1 + +RUN mkdir -pv \ + /azerothcore/bin \ + /azerothcore/data \ + /azerothcore/deps \ + /azerothcore/env/dist/bin \ + /azerothcore/env/dist/data/Cameras \ + /azerothcore/env/dist/data/dbc \ + /azerothcore/env/dist/data/maps \ + /azerothcore/env/dist/data/mmaps \ + /azerothcore/env/dist/data/vmaps \ + /azerothcore/env/dist/logs \ + /azerothcore/env/dist/temp \ + /azerothcore/env/dist/etc \ + /azerothcore/modules \ + /azerothcore/src \ + /azerothcore/build + +# Configure Timezone +RUN apt-get update \ + && apt-get install -y tzdata ca-certificates \ + && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone \ + && dpkg-reconfigure --frontend noninteractive tzdata WORKDIR /azerothcore -#================================================================ -# -# Dev: create dev server image -# -#================================================================= - -FROM base as dev +# This target builds the docker image +# This target can be useful to inspect the explicit outputs from the build, +FROM skeleton as build + +ARG CTOOLS_BUILD="all" +ARG CTYPE="RelWithDebInfo" +ARG CCACHE_CPP2="true" +ARG CSCRIPTPCH="OFF" +ARG CSCRIPTS="static" +ARG CMODULES="static" +ARG CSCRIPTS_DEFAULT_LINKAGE="static" +ARG CWITH_WARNINGS="ON" +ARG CMAKE_EXTRA_OPTIONS="" +ARG GIT_DISCOVERY_ACROSS_FILESYSTEM=1 + +ARG CCACHE_DIR="/ccache" +ARG CCACHE_MAXSIZE="1000MB" +ARG CCACHE_SLOPPINESS="pch_defines,time_macros,include_file_mtime" +ARG CCACHE_COMPRESS="" +ARG CCACHE_COMPRESSLEVEL="9" +ARG CCACHE_COMPILERCHECK="content" +ARG CCACHE_LOGFILE="" + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + build-essential ccache libtool cmake-data make cmake clang \ + git lsb-base curl unzip default-mysql-client openssl \ + default-libmysqlclient-dev libboost-all-dev libssl-dev libmysql++-dev \ + libreadline-dev zlib1g-dev libbz2-dev libncurses5-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY CMakeLists.txt /azerothcore/CMakeLists.txt +COPY conf /azerothcore/conf +COPY deps /azerothcore/deps +COPY src /azerothcore/src +COPY modules /azerothcore/modules -LABEL description="AC dev image for dev containers" - -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 - -#================================================================ -# -# SERVICE BASE: prepare the OS for the production-ready services -# -#================================================================= +ARG CACHEBUST=1 -FROM ubuntu:20.04 as servicebase +WORKDIR /azerothcore/build + +RUN --mount=type=cache,target=/ccache,sharing=locked \ + # This may seem silly (and it is), but AzerothCore wants the git repo at + # build time. The git repo is _huge_ and it's not something that really + # makes sense to mount into the container, but this way we can let the build + # have the information it needs without including the hundreds of megabytes + # of git repo into the container. + --mount=type=bind,target=/azerothcore/.git,source=.git \ + git config --global --add safe.directory /azerothcore \ + && cmake /azerothcore \ + -DCMAKE_INSTALL_PREFIX="/azerothcore/env/dist" \ + -DAPPS_BUILD="all" \ + -DTOOLS_BUILD="$CTOOLS_BUILD" \ + -DSCRIPTS="$CSCRIPTS" \ + -DMODULES="$CMODULES" \ + -DWITH_WARNINGS="$CWITH_WARNINGS" \ + -DCMAKE_BUILD_TYPE="$CTYPE" \ + -DCMAKE_CXX_COMPILER="clang++" \ + -DCMAKE_C_COMPILER="clang" \ + -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ + -DCMAKE_C_COMPILER_LAUNCHER="ccache" \ + -DBoost_USE_STATIC_LIBS="ON" \ + && cmake --build . --config "$CTYPE" -j $(($(nproc) + 1)) \ + && cmake --install . --config "$CTYPE" + +############################# +# Base runtime for services # +############################# + +FROM skeleton as runtime 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 +ENV ACORE_COMPONENT=undefined -# set timezone environment variable -ENV TZ=Etc/UTC +# Install base dependencies for azerothcore +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + libmysqlclient21 libreadline8 \ + gettext-base default-mysql-client && \ + rm -rf /var/lib/apt/lists/* -# set noninteractive mode so tzdata doesn't ask to set timezone on install -ENV DEBIAN_FRONTEND=noninteractive +COPY --from=build /azerothcore/env/dist/etc/ /azerothcore/env/ref/etc -# Create a non-root user -RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \ - adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \ - passwd -d "$DOCKER_USER" && \ - echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers - -# install the required dependencies to run the server -RUN apt-get update && apt-get install -y dos2unix gdb gdbserver google-perftools libgoogle-perftools-dev net-tools \ - libboost-system1.7*-dev libboost-filesystem1.7*-dev libboost-program-options1.7*-dev libboost-iostreams1.7*-dev \ - tzdata libmysqlclient-dev mysql-client curl unzip && rm -rf /var/lib/apt/lists/* ; +VOLUME /azerothcore/env/dist/etc -# change timezone in container -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata +ENV PATH="/azerothcore/env/dist/bin:$PATH" -# 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 groupadd --gid "$GROUP_ID" "$DOCKER_USER" && \ + useradd -d /azerothcore --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \ + passwd -d "$DOCKER_USER" && \ + chown -R "$DOCKER_USER:$DOCKER_USER" /azerothcore -COPY --chown=$DOCKER_USER:$DOCKER_USER --from=base /azerothcore /azerothcore +COPY apps/docker/entrypoint.sh /entrypoint.sh +RUN chmod -v +x /entrypoint.sh USER $DOCKER_USER -# must be created to avoid permissions errors -RUN mkdir -p /azerothcore/env/dist/data/Cameras -RUN mkdir -p /azerothcore/env/dist/data/dbc -RUN mkdir -p /azerothcore/env/dist/data/maps -RUN mkdir -p /azerothcore/env/dist/data/mmaps -RUN mkdir -p /azerothcore/env/dist/data/vmaps -RUN mkdir -p /azerothcore/env/dist/logs -RUN mkdir -p /azerothcore/env/dist/etc -RUN mkdir -p /azerothcore/env/dist/bin +ENTRYPOINT ["/entrypoint.sh"] -# Download deno and make sure the dashboard works -RUN bash /azerothcore/acore.sh quit +############### +# Auth Server # +############### -WORKDIR /azerothcore/ +FROM runtime as authserver +LABEL description "AzerothCore Auth Server" -#================================================================ -# -# AUTH & WORLD local: images used for local services -# These images don't include binaries by default -# -#================================================================= +ENV ACORE_COMPONENT=authserver +# Don't run database migrations. We can leave that up to the db-import container +ENV AC_UPDATES_ENABLE_DATABASES=0 +# This disables user prompts. The console is still active, however +ENV AC_DISABLE_INTERACTIVE=1 +ENV AC_CLOSE_IDLE_CONNECTIONS=0 -FROM servicebase as authserver-local +COPY --chown=$DOCKER_USER:$DOCKER_USER \ + --from=build \ + /azerothcore/env/dist/bin/authserver /azerothcore/env/dist/bin/authserver -LABEL description="AC authserver image for local environment" -CMD ./acore.sh run-authserver +CMD ["authserver"] -USER $DOCKER_USER +################ +# World Server # +################ -FROM servicebase as worldserver-local +FROM runtime as worldserver -LABEL description="AC worldserver image for local environment" - -CMD ./acore.sh run-worldserver - -USER $DOCKER_USER +LABEL description "AzerothCore World Server" -#================================================================ -# -# BUILD: compile sources -# -#================================================================= -FROM base as build +ENV ACORE_COMPONENT=worldserver +# Don't run database migrations. We can leave that up to the db-import container +ENV AC_UPDATES_ENABLE_DATABASES=0 +# This disables user prompts. The console is still active, however +ENV AC_DISABLE_INTERACTIVE=1 +ENV AC_CLOSE_IDLE_CONNECTIONS=0 -ARG DOCKER_USER=acore -USER $DOCKER_USER +COPY --chown=$DOCKER_USER:$DOCKER_USER \ + --from=build \ + /azerothcore/env/dist/bin/worldserver /azerothcore/env/dist/bin/worldserver -LABEL description="AC Image used by the build stage to generate production images" - -RUN mkdir -p /azerothcore/env/etc/ - -# .git is needed by the compiler -COPY --chown=$DOCKER_USER:$DOCKER_USER ./.git /azerothcore/.git -COPY --chown=$DOCKER_USER:$DOCKER_USER ./CMakeLists.txt /azerothcore/CMakeLists.txt -COPY --chown=$DOCKER_USER:$DOCKER_USER ./deps /azerothcore/deps -COPY --chown=$DOCKER_USER:$DOCKER_USER ./src /azerothcore/src -COPY --chown=$DOCKER_USER:$DOCKER_USER ./modules /azerothcore/modules -# check if we have ccache files available outside -RUN rm -rf /azerothcore/var/ccache/* -COPY --chown=$DOCKER_USER:$DOCKER_USER var/docker/ccache /azerothcore/var/ccache - -# install eluna -RUN git clone --depth=1 --branch=master https://github.com/azerothcore/mod-eluna.git /azerothcore/modules/mod-eluna - -ENV USER_CONF_PATH=/azerothcore/apps/docker/config-docker.sh -ENV CTYPE=RelWithDebInfo -ENV AC_CCACHE=true -ENV CCACHE_CPP2=true -ENV CSCRIPTPCH=OFF -ENV CCOREPCH=OFF -ENV CTOOLS_BUILD=all -# ENV CTOOLS_BUILD=maps-only -ENV CSCRIPTS=static -RUN bash apps/docker/docker-build-prod.sh - -#================================================================ -# -# AUTH SERVICE: create a ready-to-use authserver image -# with binaries included -# -#================================================================= -FROM authserver-local as authserver - -LABEL description="AC Production: authserver" +VOLUME /azerothcore/env/dist/etc -ARG DOCKER_USER=acore -USER $DOCKER_USER +CMD ["worldserver"] -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 +############# +# DB Import # +############# -#================================================================ -# -# WORLD SERVICE: create a ready-to-use worldserver image -# with binaries and data included -# -#================================================================= -FROM worldserver-local as worldserver +FROM runtime as db-import -LABEL description="AC Production: worldserver" +LABEL description "AzerothCore Database Import tool" -ARG DOCKER_USER=acore USER $DOCKER_USER -RUN mkdir -p /azerothcore/env/dist/bin/lua_scripts -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 -COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/lua_scripts /azerothcore/env/dist/bin/lua_scripts -COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/dbimport /azerothcore/env/dist/bin/dbimport +ENV ACORE_COMPONENT=dbimport -#================================================================ -# -# CLIENT DATA -# -#================================================================= +COPY --chown=$DOCKER_USER:$DOCKER_USER \ + data data -FROM ubuntu:20.04 as client-data -ARG USER_ID=1000 -ARG GROUP_ID=1000 -ARG DOCKER_USER=acore - -LABEL description="AC Production: client-data" +COPY --chown=$DOCKER_USER:$DOCKER_USER\ + --from=build \ + /azerothcore/env/dist/bin/dbimport /azerothcore/env/dist/bin/dbimport -RUN apt-get update && apt-get install -y tzdata curl unzip && rm -rf /var/lib/apt/lists/* ; +CMD /azerothcore/env/dist/bin/dbimport -# set timezone environment variable -ENV TZ=Etc/UTC +############### +# Client Data # +############### -# set noninteractive mode so tzdata doesn't ask to set timezone on install -ENV DEBIAN_FRONTEND=noninteractive +FROM skeleton as client-data -RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \ - adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \ - passwd -d "$DOCKER_USER" && \ - echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers +LABEL description="AzerothCore client-data" -# ENV DATAPATH=/azerothcore/env/dist/data-temp ENV DATAPATH=/azerothcore/env/dist/data -ENV DATAPATH_ZIP=/tmp/data.zip -RUN mkdir -p "$DATAPATH" -ARG CACHEBUST=1 -# RUN --mount=type=bind,target=/azerothcore-temp,readwrite --mount=type=cache,target=/azerothcore/env/dist/data-temp /azerothcore-temp/acore.sh client-data && cp -rT /azerothcore/env/dist/data-temp/ /azerothcore/env/dist/data && chown -R $DOCKER_USER:$DOCKER_USER /azerothcore -RUN --mount=type=bind,target=/azerothcore-temp,readwrite /azerothcore-temp/acore.sh client-data && chown -R $DOCKER_USER:$DOCKER_USER /azerothcore +RUN apt-get update && \ + apt-get install -y curl unzip && \ + rm -rf /var/lib/apt/lists/* -USER $DOCKER_USER +COPY --chown=$DOCKER_USER:$DOCKER_USER apps apps -#================================================================ -# -# TOOLS -# -#================================================================= +VOLUME /azerothcore/env/dist/data -FROM ubuntu:20.04 as tools -ARG USER_ID=1000 -ARG GROUP_ID=1000 -ARG DOCKER_USER=acore - -LABEL description="AC Production: tools" - -# List of timezones: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones +USER $DOCKER_USER -# set timezone environment variable -ENV TZ=Etc/UTC +CMD bash -c "source /azerothcore/apps/installer/includes/functions.sh && inst_download_client_data" -# set noninteractive mode so tzdata doesn't ask to set timezone on install -ENV DEBIAN_FRONTEND=noninteractive +################## +# Map Extractors # +################## -RUN apt-get update && apt-get install -y libmysqlclient-dev libssl-dev libbz2-dev \ - libboost-system1.7*-dev libboost-filesystem1.7*-dev libboost-program-options1.7*-dev libboost-iostreams1.7*-dev \ - sudo && rm -rf /var/lib/apt/lists/* ; +FROM runtime as tools -# Create a non-root user -RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \ - adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \ - passwd -d "$DOCKER_USER" && \ - echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers +LABEL description "AzerothCore Tools" -RUN mkdir -p /azerothcore/env/client/ -RUN chown -R $DOCKER_USER:$DOCKER_USER /azerothcore +WORKDIR /azerothcore/env/dist/ -USER $DOCKER_USER +RUN mkdir -pv /azerothcore/env/dist/Cameras \ + /azerothcore/env/dist/dbc \ + /azerothcore/env/dist/maps \ + /azerothcore/env/dist/mmaps \ + /azerothcore/env/dist/vmaps -WORKDIR /azerothcore/env/client/ +COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build \ + /azerothcore/env/dist/bin/map_extractor /azerothcore/env/dist/map_extractor -RUN mkdir -p /azerothcore/env/client/Cameras -RUN mkdir -p /azerothcore/env/client/dbc -RUN mkdir -p /azerothcore/env/client/maps -RUN mkdir -p /azerothcore/env/client/mmaps -RUN mkdir -p /azerothcore/env/client/vmaps +COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build \ + /azerothcore/env/dist/bin/mmaps_generator /azerothcore/env/dist/mmaps_generator -COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/map_extractor /azerothcore/env/client/map_extractor -COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/mmaps_generator /azerothcore/env/client/mmaps_generator -COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4_assembler /azerothcore/env/client/vmap4_assembler -COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4_extractor /azerothcore/env/client/vmap4_extractor +COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build \ + /azerothcore/env/dist/bin/vmap4_assembler /azerothcore/env/dist/vmap4_assembler +COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build \ + /azerothcore/env/dist/bin/vmap4_extractor /azerothcore/env/dist/vmap4_extractor diff --git a/apps/docker/Dockerfile.dev-server b/apps/docker/Dockerfile.dev-server new file mode 100644 index 0000000000..8924c4688d --- /dev/null +++ b/apps/docker/Dockerfile.dev-server @@ -0,0 +1,83 @@ +#syntax=docker/dockerfile:1.2 + +#================================================================ +# +# DEV: Stage used for the development environment +# and the locally built services +# +#================================================================= + +FROM ubuntu:22.04 as dev +ARG USER_ID=1000 +ARG GROUP_ID=1000 +ARG DOCKER_USER=acore +ARG TZ=Etc/UTC + +LABEL description="AC base image for dev containers" + +# List of timezones: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones + +ENV DOCKER=1 + +# Ensure ac-dev-server can properly pull versions +ENV GIT_DISCOVERY_ACROSS_FILESYSTEM=1 + +# set timezone environment variable +ENV TZ=$TZ + +# set noninteractive mode so tzdata doesn't ask to set timezone on install +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install -y \ + gdb gdbserver git dos2unix lsb-core sudo curl unzip \ + make cmake clang libmysqlclient-dev libboost-all-dev \ + build-essential libtool cmake-data openssl libgoogle-perftools-dev google-perftools \ + libssl-dev libmysql++-dev libreadline6-dev zlib1g-dev libbz2-dev mysql-client \ + libncurses5-dev ccache tzdata \ + && rm -rf /var/lib/apt/lists/* + +# Ensure git will work with the AzerothCore source directory +RUN git config --global --add safe.directory /azerothcore + +# change timezone in container +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ + && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata + +# Create a non-root user +RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \ + adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \ + passwd -d "$DOCKER_USER" && \ + echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers + +# must be created to set the correct permissions on them +RUN mkdir -p \ + /azerothcore/env/dist/bin \ + /azerothcore/env/dist/data/Cameras \ + /azerothcore/env/dist/data/dbc \ + /azerothcore/env/dist/data/maps \ + /azerothcore/env/dist/data/mmaps \ + /azerothcore/env/dist/data/vmaps \ + /azerothcore/env/dist/logs \ + /azerothcore/env/dist/temp \ + /azerothcore/env/dist/etc \ + /azerothcore/var/build/obj + +# Correct permissions for non-root operations +RUN chown -R $DOCKER_USER:$DOCKER_USER /home/acore /run /opt /azerothcore + +USER $DOCKER_USER + +# copy only necessary files for the acore dashboard +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 + +# Download deno and make sure the dashboard works +RUN bash /azerothcore/acore.sh quit + +WORKDIR /azerothcore diff --git a/apps/docker/README.md b/apps/docker/README.md index 80cd4fa100..546cbbfaa6 100644 --- a/apps/docker/README.md +++ b/apps/docker/README.md @@ -1,27 +1,41 @@ -# Run AzerothCore with Docker +# Docker -*This readme it's a summary of the AzerothCore docker features.* +Full documentation is [on our wiki](https://www.azerothcore.org/wiki/install-with-docker#installation) -Docker. is a software that performs operating-system-level virtualization, allowing to wrap and launch applications inside containers. +## Building -Thanks to Docker, you can quickly setup and run AzerothCore in any operating system. +### Prerequisites -The **only** requirement is having [Docker](https://docs.docker.com/install/) installed into your system. Forget about installing mysql, visual studio, cmake, etc... +Ensure that you have docker, docker compose (v2), and the docker buildx command +installed. -### Installation instructions +It's all bundled with [Docker Desktop](https://docs.docker.com/get-docker/), +though if you're using Linux you can install them through your distribution's +package manage or by using the [documentation from docker](https://docs.docker.com/engine/install/) -Check the [Install with Docker](https://www.azerothcore.org/wiki/Install-with-Docker) guide. +### Running the Build -### Memory usage +1. Build containers with command -The total amount of RAM when running all AzerothCore docker containers is **less than 2 GB**. +```console +$ docker compose build +``` - + 1. Note that the initial build will take a long time, though subsequent builds should be faster +2. Start containers with command -### Docker containers vs Virtual machines +```console +$ docker compose up -d +# Skip the build step +$ docker compose up -d --build +``` -Using Docker will have the same benefits as using virtual machines, but with much less overhead: + 1. Note that this command may take a while the first time, for the database import - +3. (on first install) You'll need to attach to the worldserver and create an Admin account +```console +$ docker compose attach ac-worldserver +AC> account create admin password 3 -1 +``` diff --git a/apps/docker/config-docker.sh b/apps/docker/config-docker.sh deleted file mode 100644 index 7f5482480d..0000000000 --- a/apps/docker/config-docker.sh +++ /dev/null @@ -1,8 +0,0 @@ -CUR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -CTOOLS_BUILD=all - -# allow the user to override configs -if [ -f "$AC_PATH_CONF/config.sh" ]; then - source "$AC_PATH_CONF/config.sh" # should overwrite previous -fi diff --git a/apps/docker/docker-build-dev.sh b/apps/docker/docker-build-dev.sh deleted file mode 100644 index ced35c437d..0000000000 --- a/apps/docker/docker-build-dev.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -CUR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -source "$CUR_PATH/docker-build-prod.sh" - -echo "Fixing EOL..." -# 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 diff --git a/apps/docker/docker-build-prod.sh b/apps/docker/docker-build-prod.sh deleted file mode 100755 index 07a42474b4..0000000000 --- a/apps/docker/docker-build-prod.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -cd /azerothcore - -bash acore.sh compiler build diff --git a/apps/docker/docker-cmd.sh b/apps/docker/docker-cmd.sh index 3a75174adc..c3b61a067e 100644 --- a/apps/docker/docker-cmd.sh +++ b/apps/docker/docker-cmd.sh @@ -54,7 +54,7 @@ while [[ $# -gt 0 ]]; do case "$1" in start:app) set -x - docker compose --profile app up + docker compose up set +x # pop the head off of the queue of args # After this, the value of $1 is the value of $2 @@ -63,102 +63,138 @@ while [[ $# -gt 0 ]]; do start:app:d) set -x - docker compose --profile app up -d + docker compose up -d set +x shift ;; build) set -x - docker compose --profile local --profile dev --profile dev-build build - docker compose --profile dev-build run --rm --no-deps ac-dev-build /bin/bash /azerothcore/apps/docker/docker-build-dev.sh + docker compose build set +x shift ;; pull) set -x - docker compose --profile local --profile dev --profile dev-build pull + docker compose pull set +x shift ;; build:nocache) set -x - docker compose --profile local --profile dev --profile dev-build build --no-cache - docker compose run --rm --no-deps ac-dev-build /bin/bash /azerothcore/apps/docker/docker-build-dev.sh + docker compose build --no-cache set +x shift ;; clean:build) set -x - docker compose run --rm --no-deps ac-dev-server bash acore.sh compiler clean - docker compose run --rm --no-deps ac-dev-server bash acore.sh compiler ccacheClean + # Don't run 'docker buildx prune' since it may "escape" our bubble + # and affect other projects on the user's workstation/server + cat <<EOF +This command has been deprecated, and at the moment does not do anything. +If you'd like to build without cache, use the command './acore.sh docker build:nocache' or look into the 'docker buildx prune command' + +> https://docs.docker.com/engine/reference/commandline/buildx_prune/ +EOF set +x shift ;; client-data) set -x - docker compose run --rm --no-deps ac-dev-server bash acore.sh client-data + docker compose up ac-client-data-init set +x shift ;; dev:up) set -x - docker compose up -d ac-dev-server + docker compose --profile dev up ac-dev-server -d set +x shift ;; dev:build) set -x - docker compose run --rm ac-dev-server bash acore.sh compiler build + docker compose --profile dev run --rm ac-dev-server bash /azerothcore/acore.sh compiler build set +x shift ;; dev:dash) set -x - docker compose run --rm ac-dev-server bash /azerothcore/acore.sh ${@:2} + docker compose --profile dev run --rm ac-dev-server bash /azerothcore/acore.sh ${@:2} set +x shift ;; dev:shell) set -x - docker compose up -d ac-dev-server - docker compose exec ac-dev-server bash ${@:2} + docker compose --profile dev up -d ac-dev-server + docker compose --profile dev exec ac-dev-server bash ${@:2} set +x shift ;; build:prod|prod:build) + cat <<EOF +This command is deprecated and is scheduled to be removed. Please update any scripts or automation accordingly to use the other command: + + ./acore.sh docker build + +The build will continue in 3 seconds +EOF + sleep 3 set -x - docker compose --profile prod build + docker compose build set +x shift ;; pull:prod|prod:pull) + cat <<EOF +This command is deprecated and is scheduled to be removed. Please update any scripts or automation accordingly to use the other command: + + ./acore.sh docker pull + +The image pull will continue in 3 seconds +EOF + sleep 3 set -x - docker compose --profile prod pull + docker compose pull set +x shift ;; prod:up|start:prod) + cat <<EOF +This command is deprecated and is scheduled to be removed. Please update any scripts or automation accordingly to use the other command: + + ./acore.sh docker start:app + +The containers will start in 3 seconds +EOF + sleep 3 set -x - docker compose --profile prod-app up + docker compose up set +x shift ;; prod:up:d|start:prod:d) + cat <<EOF +This command is deprecated and is scheduled to be removed. Please update any scripts or automation accordingly to use the other command: + + ./acore.sh docker start:app:d + +The containers will start in 3 seconds +EOF + sleep 3 set -x - docker compose --profile prod-app up -d + docker compose up -d set +x shift ;; diff --git a/apps/docker/entrypoint.sh b/apps/docker/entrypoint.sh new file mode 100644 index 0000000000..62504fc0de --- /dev/null +++ b/apps/docker/entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -euo pipefail + +# Copy all default config files to env/dist/etc if they don't already exist +# -r == recursive +# -n == no clobber (don't overwrite) +# -v == be verbose +cp -rnv /azerothcore/env/ref/etc/* /azerothcore/env/dist/etc + +CONF="/azerothcore/env/dist/etc/$ACORE_COMPONENT.conf" +CONF_DIST="/azerothcore/env/dist/etc/$ACORE_COMPONENT.conf.dist" + +# Copy the "dist" file to the "conf" if the conf doesn't already exist +if [[ -f "$CONF_DIST" ]]; then + cp -vn "$CONF_DIST" "$CONF" +else + touch "$CONF" +fi + +echo "Starting $ACORE_COMPONENT..." + +exec "$@" diff --git a/docker-compose.yml b/docker-compose.yml index 4624cb2c88..6e6d59cbdd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,57 +1,17 @@ -version: '3.9' - -# extension field: https://docs.docker.com/compose/compose-file/compose-file-v3/#extension-fields -x-networks: &networks - networks: - - ac-network - -x-build-params: &build-params - context: . - dockerfile: ./apps/docker/Dockerfile - args: - USER_ID: ${DOCKER_USER_ID:-1000} - GROUP_ID: ${DOCKER_GROUP_ID:-1000} - DOCKER_USER: ${DOCKER_USER:-acore} - # BUILDKIT_INLINE_CACHE: 1 - cache_from: - - acore/ac-wotlk-authserver:${DOCKER_IMAGE_TAG:-master} - - acore/ac-wotlk-authserver-local:${DOCKER_IMAGE_TAG:-master} - - acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} - - acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} - - acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master} - - acore/ac-wotlk-tools:${DOCKER_IMAGE_TAG:-master} - # Need to fix reduced space on GH actions first - # - acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} - -x-ac-shared-conf: &ac-shared-conf - <<: *networks - working_dir: /azerothcore - environment: - AC_DISABLE_INTERACTIVE: "1" - -x-ac-service-conf: &ac-service-conf - <<: *ac-shared-conf - # List can't be merged. See: https://forums.docker.com/t/how-to-merge-a-list-of-volumes-from-an-extension-field-into-the-service-definition/77454 - # volumes: - # - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc - # # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 - # - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated - - -services: -#======================= +# docker-compose.yml for AzerothCore. # -# DATABASE +# Start the server with `docker compose up -d --build` # -#======================= - +# Don't make changes this file! make a `docker-compose.override.yml` and make your +# changes there instead. +version: '3' +services: ac-database: - <<: *networks + container_name: ac-database image: mysql:8.0 - restart: unless-stopped - cap_add: - - SYS_NICE # CAP_SYS_NICE + networks: + - ac-network ports: - ${DOCKER_DB_EXTERNAL_PORT:-3306}:3306 environment: @@ -60,123 +20,47 @@ services: - type: volume source: ac-database target: /var/lib/mysql + restart: unless-stopped healthcheck: test: "/usr/bin/mysql --user=root --password=$$MYSQL_ROOT_PASSWORD --execute \"SHOW DATABASES;\"" interval: 5s timeout: 10s retries: 40 -#====================== -# -# Dev services -# -#====================== - - # - # Used for the build process to avoid the host binding of the /azerothcore - # and speedup the compilation by avoiding the host-container filesystem conversion issue - # on non-ext filesystems. Reference https://stackoverflow.com/a/63437557/1964544 - # - ac-dev-build: - <<: [ *ac-shared-conf ] # merge with - image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master} - user: ${DOCKER_USER:-root} - cap_add: - - SYS_NICE # CAP_SYS_NICE - build: - target: dev - <<: *build-params - security_opt: - - seccomp:unconfined - env_file: - ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} - volumes: - # expose some dist folder outside allowing the host to use them - - ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf - - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin - - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc - - ac-build-dev:/azerothcore/var/build - - ac-ccache-dev:/azerothcore/var/ccache - profiles: [dev-build] - - # - # Dev server with the ./azerothcore folder binded from the host - # Please use Linux, WSL2 or any ext-compatible filesystem - # to avoid performance issues - # - ac-dev-server: - <<: [ *ac-shared-conf ] # merge with - tty: true - image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master} - user: ${DOCKER_USER:-root} - cap_add: - - SYS_NICE # CAP_SYS_NICE - build: - target: dev - <<: *build-params - security_opt: - - seccomp:unconfined - env_file: - ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} - environment: - AC_DATA_DIR: "/azerothcore/env/dist/data" - AC_LOGS_DIR: "/azerothcore/env/dist/logs" - AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth" - AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world" - AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters" - AC_CLOSE_IDLE_CONNECTIONS: "0" - ports: - - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - volumes: - - ${DOCKER_VOL_ROOT:-.}:/azerothcore:cached - # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 - - ac-build-dev:/azerothcore/var/build - - ac-ccache-dev:/azerothcore/var/ccache - # this is not the directory of the extracted data! It's the client folder used by the extractors - - ${DOCKER_AC_CLIENT_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data - profiles: [dev] - depends_on: - ac-database: - condition: service_healthy - ac-db-import: - <<: *ac-shared-conf - image: acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally - command: ./env/dist/bin/dbimport + container_name: ac-db-import + image: acore/ac-wotlk-db-import:${DOCKER_IMAGE_TAG:-master} + networks: + - ac-network + build: + context: . + target: db-import + dockerfile: apps/docker/Dockerfile environment: AC_DATA_DIR: "/azerothcore/env/dist/data" AC_LOGS_DIR: "/azerothcore/env/dist/logs" AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth" AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world" AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters" - AC_CLOSE_IDLE_CONNECTIONS: "0" volumes: - # read-only binaries compiled by ac-dev-server - - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro - - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc:ro + - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated - profiles: [local, app, db-import-local] depends_on: ac-database: condition: service_healthy -#======================= -# -# APP Services -# -#======================= - ac-worldserver: - <<: *ac-service-conf # merge with ac-service-conf + container_name: ac-worldserver + image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} + build: + context: . + target: worldserver + dockerfile: apps/docker/Dockerfile + networks: + - ac-network stdin_open: true tty: true - cap_add: - - SYS_NICE # CAP_SYS_NICE - command: ./acore.sh run-worldserver - image: acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally restart: unless-stopped env_file: ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} @@ -186,35 +70,33 @@ services: AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth" AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world" AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters" - AC_CLOSE_IDLE_CONNECTIONS: "0" - user: ${DOCKER_USER:-root} - privileged: true - build: - target: worldserver-local - <<: *build-params ports: - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 volumes: - # read-only binaries compiled by ac-dev-server - - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro - - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc:ro + - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated # client data - - ${DOCKER_VOL_DATA:-./env/dist/data/}:/azerothcore/env/dist/data/ - profiles: [local, app, worldserver] + - ${DOCKER_VOL_DATA:-ac-client-data}:/azerothcore/env/dist/data/:ro depends_on: ac-database: condition: service_healthy ac-db-import: condition: service_completed_successfully + ac-client-data-init: + condition: service_completed_successfully ac-authserver: - <<: *ac-service-conf # merge with ac-service-conf + container_name: ac-authserver + image: acore/ac-wotlk-authserver:${DOCKER_IMAGE_TAG:-master} + build: + context: . + target: authserver + dockerfile: apps/docker/Dockerfile + networks: + - ac-network tty: true - command: ./acore.sh run-authserver - image: acore/ac-wotlk-authserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally restart: unless-stopped env_file: ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} @@ -222,199 +104,101 @@ services: AC_LOGS_DIR: "/azerothcore/env/dist/logs" AC_TEMP_DIR: "/azerothcore/env/dist/temp" AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth" - AC_SQLDRIVER_LOG_FILE: "SQLDriver.log" - AC_SQLDRIVER_QUERY_LOGGING: "1" - user: ${DOCKER_USER:-root} - build: - target: authserver-local - <<: *build-params volumes: - # read-only binaries compiled by ac-dev-server - - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated ports: - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - profiles: [local, app, authserver] depends_on: ac-database: condition: service_healthy ac-db-import: condition: service_completed_successfully -#====================== -# -# Production services -# -# The following services are used to test the production images -# Do not use them unless you know what you're doing! -# We do not offer support for them -# -# For a production-ready docker-compose, please check the official repo: https://github.com/azerothcore/acore-docker -# -#====================== - - ac-database-prod: - <<: *networks - image: mysql:8.0 - restart: unless-stopped - cap_add: - - SYS_NICE # CAP_SYS_NICE - ports: - - ${DOCKER_DB_EXTERNAL_PORT:-3306}:3306 - environment: - - MYSQL_ROOT_PASSWORD=${DOCKER_DB_ROOT_PASSWORD:-password} - volumes: - - type: volume - source: ac-database-prod - target: /var/lib/mysql - healthcheck: - test: "/usr/bin/mysql --user=root --password=$$MYSQL_ROOT_PASSWORD --execute \"SHOW DATABASES;\"" - interval: 5s - timeout: 10s - retries: 40 - profiles: [prod] - - ac-worldserver-prod: - <<: *ac-service-conf # merge with ac-service-conf - stdin_open: true - tty: true - cap_add: - - SYS_NICE # CAP_SYS_NICE - command: ./acore.sh run-worldserver - image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally - restart: unless-stopped - env_file: - ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} - environment: - AC_DATA_DIR: "/azerothcore/env/dist/data" - AC_LOGS_DIR: "/azerothcore/env/dist/logs" - AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth" - AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world" - AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters" - AC_CLOSE_IDLE_CONNECTIONS: "0" - user: ${DOCKER_USER:-root} - privileged: true - build: - target: worldserver - <<: *build-params - ports: - - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - volumes: - - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated - - ${DOCKER_VOL_CLIENT_DATA_PROD:-ac-client-data-prod}:/azerothcore/env/dist/data:ro - profiles: [prod, prod-app, prod-worldserver] - depends_on: - ac-database-prod: - condition: service_healthy - ac-db-import-prod: - condition: service_completed_successfully - ac-client-data-init: - condition: service_started - - ac-authserver-prod: - <<: *ac-service-conf # merge with ac-service-conf - tty: true - command: ./acore.sh run-authserver - image: acore/ac-wotlk-authserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally - restart: unless-stopped - env_file: - ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} - environment: - AC_LOGS_DIR: "/azerothcore/env/dist/logs" - AC_TEMP_DIR: "/azerothcore/env/dist/temp" - AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth" - AC_SQLDRIVER_LOG_FILE: "SQLDriver.log" - AC_SQLDRIVER_QUERY_LOGGING: "1" - user: ${DOCKER_USER:-root} - build: - target: authserver - <<: *build-params - volumes: - - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated - ports: - - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - profiles: [prod, prod-app, prod-authserver] - depends_on: - ac-database-prod: - condition: service_healthy - ac-db-import-prod: - condition: service_completed_successfully - ac-client-data-init: - image: acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally + container_name: ac-client-data-init + image: acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} user: ${DOCKER_USER:-root} build: + context: . target: client-data - <<: *build-params + dockerfile: apps/docker/Dockerfile args: USER_ID: ${DOCKER_USER_ID:-1000} GROUP_ID: ${DOCKER_GROUP_ID:-1000} DOCKER_USER: ${DOCKER_USER:-acore} - # BUILDKIT_INLINE_CACHE: 1 volumes: - - ${DOCKER_VOL_CLIENT_DATA_PROD:-ac-client-data-prod}:/azerothcore/env/dist/data:ro - profiles: [prod, prod-app, clientdata] + - ${DOCKER_VOL_CLIENT_DATA:-ac-client-data}:/azerothcore/env/dist/data + # used for extracting maps from files shipped with game client + # Most of the time this shouldn't be needed ac-tools: - image: acore/ac-wotlk-tools:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally + container_name: ac-tools + image: acore/ac-wotlk-tools:${DOCKER_IMAGE_TAG:-master} user: ${DOCKER_USER:-root} build: + context: . target: tools - <<: *build-params + dockerfile: apps/docker/Dockerfile working_dir: /azerothcore/env/client/ volumes: # this is not the directory of the extracted data! It's the client folder used by the extractors - ${DOCKER_AC_CLIENT_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data - profiles: [prod, tools] + # Activate with `docker compose --profile tools ...` + profiles: [tools] - ac-db-import-prod: - <<: *ac-shared-conf - image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally - command: ./env/dist/bin/dbimport + # Dev server with the ./azerothcore folder binded from the host + # Please use Linux, WSL2 or any ext-compatible filesystem + # to avoid performance issues + # + # This is primarily intended for use with the "devcontainer" project + # + # This is provided primarily for development, though it doesn't receive + # first-class support + ac-dev-server: + tty: true + image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master} + user: ${DOCKER_USER:-root} + build: + context: . + dockerfile: ./apps/docker/Dockerfile.dev-server + args: + USER_ID: ${DOCKER_USER_ID:-1000} + GROUP_ID: ${DOCKER_GROUP_ID:-1000} + DOCKER_USER: ${DOCKER_USER:-acore} + target: dev + env_file: + ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} environment: AC_DATA_DIR: "/azerothcore/env/dist/data" AC_LOGS_DIR: "/azerothcore/env/dist/logs" AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth" AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world" AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters" - AC_CLOSE_IDLE_CONNECTIONS: "0" - profiles: [prod, prod-app, db-import-prod] - - # - # Only for internal tests - # - ac-build-prod: - <<: *ac-shared-conf - build: - target: build - <<: *build-params - env_file: - ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} - working_dir: /azerothcore/ - profiles: [prod-build] + ports: + - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 + - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 + - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 + volumes: + - ${DOCKER_VOL_ROOT:-.}:/azerothcore:cached + # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 + - ac-build-dev:/azerothcore/var/build + - ac-ccache-dev:/azerothcore/var/ccache + # this is not the directory of the extracted data! It's the client folder used by the extractors + - ${DOCKER_AC_CLIENT_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data + # Activate with `docker compose --profile dev ...` + profiles: [dev] + depends_on: + ac-database: + condition: service_healthy volumes: ac-database: - ac-database-prod: - ac-bin-dev: + ac-client-data: + # Used for dev server ac-build-dev: ac-ccache-dev: - ac-proj: - ac-client-data-prod: - # not used, but you can use them by setting - # the DOCKER_VOL_* env variabiles - ac-root: - ac-conf: - ac-etc: - ac-logs: - ac-client-data-cameras: - ac-client-data-dbc: - ac-client-data-maps: - ac-client-data-vmaps: - ac-client-data-mmaps: networks: ac-network: |