mirror of https://github.com/cocosolos/lsd.git
Add Alpine build
- Add build args for user/group. - Lots of cleanup and adjustments for safety and efficiency. - Update LSB submodule ref.
This commit is contained in:
parent
dcd8479c79
commit
48d87f667d
|
|
@ -1,8 +1,9 @@
|
||||||
|
# Nothing tracked by LSB git should be in here.
|
||||||
|
# Keeps git hash clean during build.
|
||||||
server/build
|
server/build
|
||||||
server/documentation
|
server/log/*.log
|
||||||
server/log
|
server/losmeshes/**
|
||||||
server/losmeshes
|
server/navmeshes/**
|
||||||
server/navmeshes
|
server/settings/*.lua
|
||||||
server/scripts
|
server/sql/backups/*.sql
|
||||||
server/settings
|
server/tools/config.yaml
|
||||||
server/sql
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
config
|
config/**
|
||||||
|
!.gitkeep
|
||||||
|
|
|
||||||
62
Dockerfile
62
Dockerfile
|
|
@ -1,62 +0,0 @@
|
||||||
##############
|
|
||||||
# Base stage #
|
|
||||||
##############
|
|
||||||
FROM ubuntu:latest AS base
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
RUN rm -f /etc/apt/apt.conf.d/docker-clean && \
|
|
||||||
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
|
|
||||||
> /etc/apt/apt.conf.d/keep-cache
|
|
||||||
|
|
||||||
###############
|
|
||||||
# Build stage #
|
|
||||||
###############
|
|
||||||
FROM base AS build
|
|
||||||
|
|
||||||
# Install build exclusive dependencies.
|
|
||||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
||||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
|
||||||
apt update && apt install -yqq --no-install-recommends \
|
|
||||||
binutils-dev build-essential cmake git python3 python3-dev python3-pip \
|
|
||||||
software-properties-common libluajit-5.1-dev libmariadb-dev-compat \
|
|
||||||
libssl-dev libzmq3-dev zlib1g-dev
|
|
||||||
|
|
||||||
# Install Python dependencies as user to facilitate copying to runtime image.
|
|
||||||
RUN --mount=type=bind,source=./server/tools/requirements.txt,target=/tmp/requirements.txt \
|
|
||||||
--mount=type=cache,target=/root/.cache/pip \
|
|
||||||
pip3 install --break-system-packages --user --requirement /tmp/requirements.txt
|
|
||||||
|
|
||||||
# LSB requires Git for the build, and emits version.cpp along with the executables.
|
|
||||||
# The bind mounted server directory does not persist changes, so copy these from/to
|
|
||||||
# the cached build folder, preserving timestamps to avoid unnecessary rebuilds.
|
|
||||||
# Then make a copy of the executables that can be passed to the runtime stage.
|
|
||||||
RUN --mount=type=cache,target=/build \
|
|
||||||
--mount=type=bind,source=./.git,target=/.git \
|
|
||||||
--mount=type=bind,source=./server,target=/server,rw \
|
|
||||||
cp -p /build/version.cpp /server/src/common 2> /dev/null || true && \
|
|
||||||
cp -p /build/xi_* /server 2> /dev/null || true && \
|
|
||||||
cmake -S /server -B /build -DCMAKE_BUILD_TYPE=Release && \
|
|
||||||
cmake --build /build -j$(nproc) && \
|
|
||||||
cp -p /server/src/common/version.cpp /build && \
|
|
||||||
cp -p /server/xi_* /build && \
|
|
||||||
cp /server/xi_* /root
|
|
||||||
|
|
||||||
#################
|
|
||||||
# Runtime stage #
|
|
||||||
#################
|
|
||||||
FROM base AS service
|
|
||||||
|
|
||||||
# Install runtime dependencies.
|
|
||||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
|
||||||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
|
||||||
apt update && apt install -yqq --no-install-recommends \
|
|
||||||
binutils git libluajit-5.1-2 libssl3t64 libzmq5 mariadb-client \
|
|
||||||
python3 zlib1g \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
WORKDIR /server
|
|
||||||
RUN git config --global --add safe.directory /server
|
|
||||||
|
|
||||||
# Copy installed Python dependencies and built executables from build stage.
|
|
||||||
COPY --from=build /root/.local /root/.local
|
|
||||||
COPY --from=build /root/xi_* /server
|
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
|
||||||
23
README.md
23
README.md
|
|
@ -19,10 +19,10 @@ That's it! All the setup is handled for you. Check out the [official LSB documen
|
||||||
- Use these to stop/start the server when rebuilding isn't necessary.
|
- Use these to stop/start the server when rebuilding isn't necessary.
|
||||||
|
|
||||||
- `docker compose build`
|
- `docker compose build`
|
||||||
- Builds the image. With caching, this basically means rebuild the executables.
|
- Builds the image. With caching, this basically just rebuilds the executables if needed. Use `--no-cache` for a full clean build.
|
||||||
|
|
||||||
- `docker compose down`
|
- `docker compose down`
|
||||||
- Shuts down and deletes the containers.
|
- Shuts down and removes the containers.
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
|
|
@ -30,10 +30,21 @@ That's it! All the setup is handled for you. Check out the [official LSB documen
|
||||||
|
|
||||||
- `git submodule update --remote --merge`
|
- `git submodule update --remote --merge`
|
||||||
- This will pull the latest changes from upstream LSB. Run `docker compose up --build --detach` again to rebuild and start/restart the containers.
|
- This will pull the latest changes from upstream LSB. Run `docker compose up --build --detach` again to rebuild and start/restart the containers.
|
||||||
|
- You can also just change to the server directory and treat it as its own repo (change branch, fork, apply patches, etc.)
|
||||||
|
|
||||||
|
## Alpine
|
||||||
|
|
||||||
|
Alpine Linux is a minimal image that comes in at about half the size of the Ubuntu image (excluding bind mounted files/directories). The Alpine build is experimental and unsupported by LSB. It uses a newer version of GCC and the [musl libc](https://wiki.musl-libc.org/functional-differences-from-glibc.html). Use at your own risk.
|
||||||
|
|
||||||
|
`docker compose -f ./docker-compose.yml -f ./docker-compose.alpine.yml up --build --detach`
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
|
- The image is built with a default user and group named `xiadmin` with UID and GID `1000`.
|
||||||
|
- You can supply the build args `UNAME`, `UGROUP`, `UID`, `GID` to change these.
|
||||||
|
- `docker compose build --build-arg UID="$(id -u)" --build-arg GID="$(id -g)" --build-arg UNAME="$(whoami)"`
|
||||||
- If using WSL with Windows, make sure [the project is stored in the WSL file system](https://learn.microsoft.com/en-us/windows/wsl/filesystems#file-storage-and-performance-across-file-systems) for best performance.
|
- If using WSL with Windows, make sure [the project is stored in the WSL file system](https://learn.microsoft.com/en-us/windows/wsl/filesystems#file-storage-and-performance-across-file-systems) for best performance.
|
||||||
|
- You may experience issues related to the system clock. Using `sudo hwclock --hctosys` in WSL may help.
|
||||||
- Secure database passwords and a default user and database name are generated into `config/.env` to simplify the setup process.
|
- Secure database passwords and a default user and database name are generated into `config/.env` to simplify the setup process.
|
||||||
- **Optional** - You can manually create this _before_ building the containers with these variables:
|
- **Optional** - You can manually create this _before_ building the containers with these variables:
|
||||||
```
|
```
|
||||||
|
|
@ -41,12 +52,10 @@ That's it! All the setup is handled for you. Check out the [official LSB documen
|
||||||
MARIADB_USER=
|
MARIADB_USER=
|
||||||
MARIADB_PASSWORD=
|
MARIADB_PASSWORD=
|
||||||
MARIADB_ROOT_PASSWORD=
|
MARIADB_ROOT_PASSWORD=
|
||||||
XI_NETWORK_ENABLE_HTTP=
|
|
||||||
```
|
```
|
||||||
Otherwise, the default user is `xiadmin`, the default database is `xidb`, and both passwords are randomly generated.
|
Otherwise, the default user is `xiadmin`, the default database is `xidb`, and the password is randomly generated.
|
||||||
- The LSB HTTP API is enabled by default and can be accessed at http://localhost:8088/.
|
- If `config/.env` is automatically generated, a random initial password for the root user will be generated and printed to stdout (check your build log!)
|
||||||
- This can be disabled by setting `XI_NETWORK_ENABLE_HTTP=0`
|
- Because environment variables are used, the server settings `SQL_LOGIN`, `SQL_PASSWORD`, and `SQL_DATABASE` (all located in network.lua) are not used.
|
||||||
- Because environment variables are used, the server settings `SQL_LOGIN`, `SQL_PASSWORD`, `SQL_DATABASE`, and `ENABLE_HTTP` (located in network.lua) are not used.
|
|
||||||
- Because LSB uses Git during the build and update process, changes to the Git metadata will trigger an image rebuild, but with caching this shouldn't be significant.
|
- Because LSB uses Git during the build and update process, changes to the Git metadata will trigger an image rebuild, but with caching this shouldn't be significant.
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
services:
|
||||||
|
dbtool:
|
||||||
|
image: lsd_service:alpine
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: docker/alpine.Dockerfile
|
||||||
|
|
||||||
|
connect:
|
||||||
|
image: lsd_service:alpine
|
||||||
|
|
||||||
|
search:
|
||||||
|
image: lsd_service:alpine
|
||||||
|
|
||||||
|
world:
|
||||||
|
image: lsd_service:alpine
|
||||||
|
|
||||||
|
map:
|
||||||
|
image: lsd_service:alpine
|
||||||
|
|
@ -1,20 +1,18 @@
|
||||||
x-common: &common # Configs used by more than one service.
|
x-common: &common # Configs used by more than one service.
|
||||||
image: lsd_service
|
image: lsd_service:ubuntu
|
||||||
pull_policy: never
|
pull_policy: never
|
||||||
entrypoint: ["/entrypoint.sh"] # Copies the MariaDB env vars into corresponding LSB settings.
|
|
||||||
environment:
|
environment:
|
||||||
XI_NETWORK_HTTP_HOST: 0.0.0.0
|
XI_NETWORK_HTTP_HOST: 0.0.0.0
|
||||||
XI_NETWORK_ZMQ_IP: world
|
XI_NETWORK_ZMQ_IP: world
|
||||||
XI_NETWORK_SQL_HOST: database
|
XI_NETWORK_SQL_HOST: database
|
||||||
volumes: # YAML merge can't be used with sequences, so bind everything here. (SEE NOTE ABOUT WSL IN README!)
|
volumes:
|
||||||
|
- ./.git:/.git
|
||||||
- ./config:/config
|
- ./config:/config
|
||||||
- ./.git:/.git # Since LSB is a submodule, we want to preserve
|
- ./server/.git:/server/.git
|
||||||
- ./server/.git:/server/.git # the directory structure inside the container.
|
|
||||||
- ./server/log:/server/log
|
- ./server/log:/server/log
|
||||||
- ./server/losmeshes:/server/losmeshes
|
- ./server/losmeshes:/server/losmeshes
|
||||||
- ./server/modules:/server/modules
|
- ./server/modules:/server/modules
|
||||||
- ./server/navmeshes:/server/navmeshes
|
- ./server/navmeshes:/server/navmeshes
|
||||||
- ./server/res:/server/res
|
|
||||||
- ./server/scripts:/server/scripts
|
- ./server/scripts:/server/scripts
|
||||||
- ./server/settings:/server/settings
|
- ./server/settings:/server/settings
|
||||||
- ./server/sql:/server/sql
|
- ./server/sql:/server/sql
|
||||||
|
|
@ -24,22 +22,24 @@ services:
|
||||||
database:
|
database:
|
||||||
image: mariadb
|
image: mariadb
|
||||||
entrypoint: ["/mariadb-entrypoint.sh"]
|
entrypoint: ["/mariadb-entrypoint.sh"]
|
||||||
|
command: ["mariadbd"]
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
volumes:
|
||||||
- ./config:/config
|
- ./config:/config
|
||||||
- ./mariadb-entrypoint.sh:/mariadb-entrypoint.sh # Custom entrypoint to generate .env.
|
- ./mariadb-entrypoint.sh:/mariadb-entrypoint.sh # Custom entrypoint to generate .env.
|
||||||
- ./server/sql:/docker-entrypoint-initdb.d # Initializes the database.
|
|
||||||
- database:/var/lib/mysql
|
- database:/var/lib/mysql
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||||
start_period: 3m # First time initialization takes a while, so give it extra time.
|
start_period: 10s
|
||||||
interval: 15s # TODO: use dbtool setup, set lower healthcheck.
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 4
|
retries: 3
|
||||||
|
|
||||||
dbtool:
|
dbtool:
|
||||||
<<: *common # Import common configs.
|
<<: *common # Import common configs.
|
||||||
build: . # This service builds the image shared by all LSB services.
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: docker/ubuntu.Dockerfile # This service builds the image shared by all LSB services.
|
||||||
command: ["python3", "/server/tools/dbtool.py", "update"]
|
command: ["python3", "/server/tools/dbtool.py", "update"]
|
||||||
restart: no
|
restart: no
|
||||||
depends_on:
|
depends_on:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
# syntax=docker/dockerfile:1-labs
|
||||||
|
|
||||||
|
##############
|
||||||
|
# Base stage #
|
||||||
|
##############
|
||||||
|
FROM alpine:latest AS base
|
||||||
|
|
||||||
|
ARG UNAME=xiadmin
|
||||||
|
ARG UGROUP=xiadmin
|
||||||
|
ARG UID=1000
|
||||||
|
ARG GID=1000
|
||||||
|
|
||||||
|
RUN addgroup --gid $GID $UGROUP && \
|
||||||
|
adduser --uid $UID $UNAME --ingroup $UGROUP --home /xiadmin --disabled-password
|
||||||
|
|
||||||
|
# Install runtime dependencies at the base level.
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apk,sharing=locked \
|
||||||
|
apk --update-cache add \
|
||||||
|
binutils \
|
||||||
|
git \
|
||||||
|
luajit \
|
||||||
|
mariadb-client \
|
||||||
|
mariadb-connector-c \
|
||||||
|
openssl \
|
||||||
|
python3 \
|
||||||
|
zeromq \
|
||||||
|
zlib
|
||||||
|
|
||||||
|
RUN git config --system --add safe.directory /server
|
||||||
|
ENV PATH=/xiadmin/.local/bin:$PATH
|
||||||
|
|
||||||
|
###############
|
||||||
|
# Build stage #
|
||||||
|
###############
|
||||||
|
FROM base AS build
|
||||||
|
|
||||||
|
# Install build dependencies.
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apk,sharing=locked \
|
||||||
|
apk --update-cache add \
|
||||||
|
binutils-dev \
|
||||||
|
ccache \
|
||||||
|
cmake \
|
||||||
|
g++ \
|
||||||
|
linux-headers \
|
||||||
|
luajit-dev \
|
||||||
|
make \
|
||||||
|
mariadb-dev \
|
||||||
|
openssl-dev \
|
||||||
|
python3-dev \
|
||||||
|
py3-pip \
|
||||||
|
zeromq-dev \
|
||||||
|
zlib-dev
|
||||||
|
|
||||||
|
USER $UNAME
|
||||||
|
WORKDIR /server
|
||||||
|
|
||||||
|
# Install Python dependencies here, copied into runtime stage.
|
||||||
|
RUN --mount=type=bind,source=server/tools/requirements.txt,target=/tmp/requirements.txt \
|
||||||
|
--mount=type=cache,target=/xiadmin/.cache/pip,uid=$UID,gid=$GID \
|
||||||
|
pip3 install --break-system-packages --user --ignore-installed --requirement /tmp/requirements.txt
|
||||||
|
|
||||||
|
# Exclude changes to git metadata, scripts, and sql not needed for build.
|
||||||
|
# Excluded here instead of dockerignore so they can be bind mounted during build.
|
||||||
|
# Saves from copying everything whenever scripts/sql change.
|
||||||
|
# https://docs.docker.com/reference/dockerfile/#copy---exclude (docker/dockerfile:1.7-labs)
|
||||||
|
COPY --chown=$UNAME:$UGROUP --exclude=.git --exclude=scripts --exclude=sql server /server
|
||||||
|
|
||||||
|
# --- PATCH LSB ---
|
||||||
|
RUN LSB_FILE="/server/cmake/FindMariaDBCPP.cmake" && \
|
||||||
|
if [ -f "$LSB_FILE" ]; then \
|
||||||
|
# Check if replacement is needed.
|
||||||
|
if grep -qF 'b09555de99ed4b1d054a88ff85acbae996bce1d1' "$LSB_FILE"; then \
|
||||||
|
echo "Patching $LSB_FILE: Update MariaDB Connector/C++ to 1.0.5 (fixes compilation on Alpine)"; \
|
||||||
|
sed -i 's/b09555de99ed4b1d054a88ff85acbae996bce1d1/a36ff95ac6a6236a2faaaa6ec710219c8aabe35d/g' "$LSB_FILE"; \
|
||||||
|
fi; \
|
||||||
|
else \
|
||||||
|
echo "Warning: $LSB_FILE not found, skipping patch."; \
|
||||||
|
fi;
|
||||||
|
# --- End Patch ---
|
||||||
|
|
||||||
|
# Cache the build. Bind mounts to save copy time and keep clean git hash.
|
||||||
|
ENV CCACHE_DIR=/xiadmin/.ccache
|
||||||
|
RUN --mount=type=cache,target=/xiadmin/build,uid=$UID,gid=$GID \
|
||||||
|
--mount=type=cache,target=/xiadmin/.ccache,uid=$UID,gid=$GID \
|
||||||
|
--mount=type=bind,source=.git,target=/.git \
|
||||||
|
--mount=type=bind,source=server/.git,target=/server/.git \
|
||||||
|
--mount=type=bind,source=server/scripts,target=/server/scripts \
|
||||||
|
--mount=type=bind,source=server/sql,target=/server/sql \
|
||||||
|
# --- CACHE ---
|
||||||
|
cp -p /xiadmin/build/version.cpp /server/src/common/ 2> /dev/null; \
|
||||||
|
cp -p /xiadmin/build/xi_* /server/ 2> /dev/null; \
|
||||||
|
# --- End ---
|
||||||
|
cmake -S /server -B /xiadmin/build -DCMAKE_BUILD_TYPE=Release && \
|
||||||
|
# --- PATCH efsw ---
|
||||||
|
EFSW_FILE="/xiadmin/build/_deps/efsw-src/src/efsw/FileWatcherInotify.cpp"; \
|
||||||
|
if [ -f "$EFSW_FILE" ]; then \
|
||||||
|
# Check if include is missing.
|
||||||
|
if ! grep -qF '#include <sys/select.h>' "$EFSW_FILE"; then \
|
||||||
|
echo "Patching $EFSW_FILE: Adding #include <sys/select.h>"; \
|
||||||
|
sed -i '1i #include <sys/select.h>' "$EFSW_FILE"; \
|
||||||
|
fi; \
|
||||||
|
# Check if replacement is needed.
|
||||||
|
if grep -qF 'u_int32_t' "$EFSW_FILE"; then \
|
||||||
|
echo "Patching $EFSW_FILE: Replacing u_int32_t with uint32_t"; \
|
||||||
|
sed -i 's/u_int32_t/uint32_t/g' "$EFSW_FILE"; \
|
||||||
|
fi; \
|
||||||
|
else \
|
||||||
|
echo "Warning: $EFSW_SRC_FILE not found, skipping patch."; \
|
||||||
|
fi; \
|
||||||
|
# --- End Patch ---
|
||||||
|
cmake --build /xiadmin/build -j$(nproc) && \
|
||||||
|
# --- CACHE ---
|
||||||
|
# Alpine seems to always re-link the executables.
|
||||||
|
cp -p /server/xi_* /xiadmin/build/; \
|
||||||
|
cp -p /server/src/common/version.cpp /xiadmin/build/;
|
||||||
|
# --- End ---
|
||||||
|
|
||||||
|
#################
|
||||||
|
# Runtime stage #
|
||||||
|
#################
|
||||||
|
FROM base AS service
|
||||||
|
|
||||||
|
USER $UNAME
|
||||||
|
WORKDIR /server
|
||||||
|
|
||||||
|
COPY server/res/compress.dat server/res/decompress.dat /server/res/
|
||||||
|
|
||||||
|
# Copy installed Python dependencies and built executables from build stage.
|
||||||
|
COPY --from=build /xiadmin/.local /xiadmin/.local
|
||||||
|
COPY --from=build /server/xi_* /server/
|
||||||
|
|
||||||
|
COPY --chmod=0755 entrypoint.sh /entrypoint.sh
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
# syntax=docker/dockerfile:1-labs
|
||||||
|
|
||||||
|
##############
|
||||||
|
# Base stage #
|
||||||
|
##############
|
||||||
|
FROM ubuntu:latest AS base
|
||||||
|
|
||||||
|
ARG UNAME=xiadmin
|
||||||
|
ARG UGROUP=xiadmin
|
||||||
|
ARG UID=1000
|
||||||
|
ARG GID=1000
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
RUN rm -f /etc/apt/apt.conf.d/docker-clean && \
|
||||||
|
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' \
|
||||||
|
> /etc/apt/apt.conf.d/keep-cache
|
||||||
|
|
||||||
|
RUN userdel --remove ubuntu && \
|
||||||
|
groupadd --gid $GID $UNAME && \
|
||||||
|
useradd --uid $UID $UNAME --gid $UGROUP --home-dir /xiadmin --create-home --skel /dev/null
|
||||||
|
|
||||||
|
# Install runtime dependencies at the base level.
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get update && apt-get install --assume-yes --no-install-recommends --quiet \
|
||||||
|
binutils \
|
||||||
|
git \
|
||||||
|
libluajit-5.1-2 \
|
||||||
|
libssl3t64 \
|
||||||
|
libzmq5 \
|
||||||
|
mariadb-client \
|
||||||
|
python3 \
|
||||||
|
zlib1g
|
||||||
|
|
||||||
|
RUN git config --system --add safe.directory /server
|
||||||
|
ENV PATH=/xiadmin/.local/bin:$PATH
|
||||||
|
|
||||||
|
###############
|
||||||
|
# Build stage #
|
||||||
|
###############
|
||||||
|
FROM base AS build
|
||||||
|
|
||||||
|
# Install build dependencies.
|
||||||
|
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
|
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||||||
|
apt-get update && apt-get install --assume-yes --no-install-recommends --quiet \
|
||||||
|
binutils-dev \
|
||||||
|
build-essential \
|
||||||
|
ccache \
|
||||||
|
cmake \
|
||||||
|
g++ \
|
||||||
|
git \
|
||||||
|
libluajit-5.1-dev \
|
||||||
|
libmariadb-dev-compat \
|
||||||
|
libssl-dev \
|
||||||
|
libzmq3-dev \
|
||||||
|
make \
|
||||||
|
python3-dev \
|
||||||
|
python3-pip \
|
||||||
|
zlib1g-dev
|
||||||
|
|
||||||
|
USER $UNAME
|
||||||
|
WORKDIR /server
|
||||||
|
|
||||||
|
# Install Python dependencies here, copied into runtime stage.
|
||||||
|
RUN --mount=type=bind,source=server/tools/requirements.txt,target=/tmp/requirements.txt \
|
||||||
|
--mount=type=cache,target=/xiadmin/.cache/pip,uid=$UID,gid=$GID \
|
||||||
|
pip3 install --break-system-packages --user --ignore-installed --requirement /tmp/requirements.txt
|
||||||
|
|
||||||
|
# Exclude changes to git metadata, scripts, and sql not needed for build.
|
||||||
|
# Excluded here instead of dockerignore so they can be bind mounted during build.
|
||||||
|
# Saves from copying everything whenever scripts/sql change.
|
||||||
|
# https://docs.docker.com/reference/dockerfile/#copy---exclude (docker/dockerfile:1.7-labs)
|
||||||
|
COPY --chown=$UNAME:$UGROUP --exclude=.git --exclude=scripts --exclude=sql server /server
|
||||||
|
|
||||||
|
# Cache the build. Bind mounts to save copy time and keep clean git hash.
|
||||||
|
ENV CCACHE_DIR=/xiadmin/.ccache
|
||||||
|
RUN --mount=type=cache,target=/xiadmin/build,uid=$UID,gid=$GID \
|
||||||
|
--mount=type=cache,target=/xiadmin/.ccache,uid=$UID,gid=$GID \
|
||||||
|
--mount=type=bind,source=.git,target=/.git \
|
||||||
|
--mount=type=bind,source=server/.git,target=/server/.git \
|
||||||
|
--mount=type=bind,source=server/scripts,target=/server/scripts \
|
||||||
|
--mount=type=bind,source=server/sql,target=/server/sql \
|
||||||
|
# --- CACHE ---
|
||||||
|
cp -p /xiadmin/build/version.cpp /server/src/common/ 2> /dev/null; \
|
||||||
|
cp -p /xiadmin/build/xi_* /server/ 2> /dev/null; \
|
||||||
|
# --- End ---
|
||||||
|
cmake -S /server -B /xiadmin/build -DCMAKE_BUILD_TYPE=Release && \
|
||||||
|
cmake --build /xiadmin/build -j$(nproc) && \
|
||||||
|
# --- CACHE ---
|
||||||
|
cp -p /server/xi_* /xiadmin/build/; \
|
||||||
|
cp -p /server/src/common/version.cpp /xiadmin/build/;
|
||||||
|
# --- End ---
|
||||||
|
|
||||||
|
#################
|
||||||
|
# Runtime stage #
|
||||||
|
#################
|
||||||
|
FROM base AS service
|
||||||
|
|
||||||
|
USER $UNAME
|
||||||
|
WORKDIR /server
|
||||||
|
|
||||||
|
COPY server/res/compress.dat server/res/decompress.dat /server/res/
|
||||||
|
|
||||||
|
# Copy installed Python dependencies and built executables from build stage.
|
||||||
|
COPY --from=build /xiadmin/.local /xiadmin/.local
|
||||||
|
COPY --from=build /server/xi_* /server/
|
||||||
|
|
||||||
|
COPY --chmod=0755 entrypoint.sh /entrypoint.sh
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
@ -1,11 +1,18 @@
|
||||||
#!/bin/bash
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
# Export XI_ variables from corresponding MARIADB_ variables.
|
echo "Loading configuration from /config/.env..."
|
||||||
set -a
|
if [ -f "/config/.env" ]; then
|
||||||
source "/config/.env"
|
set -a
|
||||||
set +a
|
. "/config/.env"
|
||||||
export XI_NETWORK_SQL_DATABASE=$MARIADB_DATABASE
|
set +a
|
||||||
export XI_NETWORK_SQL_LOGIN=$MARIADB_USER
|
unset MARIADB_ROOT_PASSWORD
|
||||||
export XI_NETWORK_SQL_PASSWORD="$MARIADB_PASSWORD"
|
else
|
||||||
|
echo "Warning: /config/.env not found."
|
||||||
|
fi
|
||||||
|
|
||||||
|
export XI_NETWORK_SQL_PASSWORD="$MARIADB_PASSWORD" && unset MARIADB_PASSWORD
|
||||||
|
export XI_NETWORK_SQL_LOGIN="$MARIADB_USER" && unset MARIADB_USER
|
||||||
|
export XI_NETWORK_SQL_DATABASE="$MARIADB_DATABASE" && unset MARIADB_DATABASE
|
||||||
|
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|
|
||||||
|
|
@ -1,34 +1,38 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
ENV_FILE="/config/.env"
|
ENV_FILE="/config/.env"
|
||||||
|
|
||||||
|
echo "Running custom entrypoint..."
|
||||||
|
|
||||||
# Set default values if the .env file doesn't exist.
|
# Set default values if the .env file doesn't exist.
|
||||||
if [ ! -e "$ENV_FILE" ]; then
|
if [ ! -e "$ENV_FILE" ]; then
|
||||||
|
echo "$ENV_FILE not found, generating one..."
|
||||||
MARIADB_DATABASE=xidb
|
MARIADB_DATABASE=xidb
|
||||||
MARIADB_USER=xiadmin
|
MARIADB_USER=xiadmin
|
||||||
XI_NETWORK_ENABLE_HTTP=1
|
|
||||||
|
|
||||||
# Generate random passwords. (MARIADB_RANDOM_ROOT_PASSWORD)
|
# Generate random passwords. (MARIADB_RANDOM_ROOT_PASSWORD)
|
||||||
# https://github.com/MariaDB/mariadb-docker/blob/87a043a031e8c56ba66a0ad06e633417ae75ee1e/docker-entrypoint.sh#L378-L382
|
# https://github.com/MariaDB/mariadb-docker/blob/87a043a031e8c56ba66a0ad06e633417ae75ee1e/docker-entrypoint.sh#L378-L382
|
||||||
MARIADB_PASSWORD=$(pwgen --numerals --capitalize --symbols --remove-chars="'\\" -1 32)
|
MARIADB_PASSWORD=$(pwgen --numerals --capitalize --symbols --remove-chars="'\\" -1 32)
|
||||||
MARIADB_ROOT_PASSWORD=$(pwgen --numerals --capitalize --symbols --remove-chars="'\\" -1 32)
|
export MARIADB_RANDOM_ROOT_PASSWORD=1
|
||||||
|
|
||||||
# Write the variables to the .env file.
|
# Write the variables to the .env file.
|
||||||
cat <<-EOF > "$ENV_FILE"
|
cat <<-EOF > "$ENV_FILE"
|
||||||
MARIADB_DATABASE=$MARIADB_DATABASE
|
MARIADB_DATABASE=$MARIADB_DATABASE
|
||||||
MARIADB_USER=$MARIADB_USER
|
MARIADB_USER=$MARIADB_USER
|
||||||
MARIADB_PASSWORD='$MARIADB_PASSWORD'
|
MARIADB_PASSWORD='$MARIADB_PASSWORD'
|
||||||
MARIADB_ROOT_PASSWORD='$MARIADB_ROOT_PASSWORD'
|
|
||||||
XI_NETWORK_ENABLE_HTTP=$XI_NETWORK_ENABLE_HTTP # Enables the LSB HTTP API
|
|
||||||
EOF
|
EOF
|
||||||
|
chown mysql:mysql "$ENV_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Load environment variables.
|
# Load environment variables.
|
||||||
if [ -f "$ENV_FILE" ]; then
|
if [ -f "$ENV_FILE" ]; then
|
||||||
|
echo "Loading environment vairables from $ENV_FILE..."
|
||||||
set -a # Automatically export all sourced variables.
|
set -a # Automatically export all sourced variables.
|
||||||
source "$ENV_FILE"
|
source "$ENV_FILE"
|
||||||
set +a
|
set +a
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Execute the original MariaDB entrypoint.
|
# Execute the original MariaDB entrypoint.
|
||||||
exec /usr/local/bin/docker-entrypoint.sh mariadbd "$@"
|
echo "Handing over to official MariaDB entrypoint..."
|
||||||
|
exec /usr/local/bin/docker-entrypoint.sh "$@"
|
||||||
|
|
|
||||||
2
server
2
server
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0985720f78dfc8cfc5b93b55e2ea672baba4cd26
|
Subproject commit f283f72fdbf83f718b250032411a0bb0430ec775
|
||||||
Loading…
Reference in New Issue