# Runtime environment for modding/src/mdlp/ (the first-party Mod Definition # Language Processor - see ../README.md): builds mdlp from source and runs it # against modding/mods/ to produce modding/dist/mods/. Kept as its own image, # separate from hacked-build-image/, because mod processing is expected to # grow its own external tool dependencies (image/audio conversion, etc.) # independent of hacked's own GTK/GLFW/mingw toolchain. FROM ubuntu:22.04 # go.mod's own "go" directive is a minimum toolchain version, not a version to # fetch - pin a stable release that already satisfies it so `go build` never # needs to fetch a newer toolchain over the network at build time. ARG GO_VERSION=1.27.1 # patch: applies src/hacked-patches/ to the scratch copy of hacked/ that # process-mods.sh (and ../gen_animgallery.sh) stage before building against # it - see stage-hacked.sh. python3/pip: runs the AI upscaler below via # plain CPU inference (ONNX Runtime). Not a Vulkan-based tool: this image # has no real GPU, and Vulkan software emulation (Mesa lavapipe) gives # wrong colors for ML inference workloads. RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ ca-certificates curl gosu patch python3 python3-pip \ && rm -rf /var/lib/apt/lists/* RUN pip3 install --no-cache-dir onnxruntime pillow numpy # The AI upscaler model for mdlp's upscale mod type (see ../README.md # section 4): RealESRGAN_x4plus_anime_6B, a 6-block RRDBNet ONNX-exported # from xinntao/Real-ESRGAN's anime-illustration checkpoint (BSD-3-Clause). # It's trained on flat-color line art, so it keeps hard sprite edges rather # than smoothing them the way a photo- or video-denoising model would. A # mod's own "model" field (upscaleDef in ../src/mdlp/upscale.go) is not # consulted; every resource goes through this one model. upscale_batch.py # resizes its fixed native 4x output down to whatever scale a mod actually # asks for. ARG UPSCALE_MODEL_URL=https://huggingface.co/skillsafe-ai/realesrgan-x4plus-anime-6b/resolve/main/model.onnx RUN mkdir -p /opt/upscale-model \ && curl -sSL -o /opt/upscale-model/model.onnx "$UPSCALE_MODEL_URL" COPY mdlp-image/upscale_batch.py /usr/local/bin/upscale_batch.py RUN chmod 755 /usr/local/bin/upscale_batch.py ENV UPSCALE_MODEL_PATH=/opt/upscale-model/model.onnx RUN curl -sSLO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" \ && tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz" \ && rm "go${GO_VERSION}.linux-amd64.tar.gz" ENV PATH=/usr/local/go/bin:${PATH} ENV GOTOOLCHAIN=local ENV GOPATH=/opt/go # Populates /opt/go/pkg/mod with every dependency mdlp/go.mod pins, so the # container never needs network access to build it. mdlp/go.mod replaces # github.com/inkyblackness/hacked with the local ../hacked (see ../README.md), # so that module's own go.mod/go.sum have to be present too for dependency # resolution - only these two go.mod/go.sum pairs are copied in for this, not # the rest of either source tree, so editing .go files doesn't invalidate # this layer's cache. COPY src/hacked/go.mod src/hacked/go.sum /tmp/mdlp-deps/hacked/ COPY src/mdlp/go.mod src/mdlp/go.sum /tmp/mdlp-deps/mdlp/ RUN cd /tmp/mdlp-deps/mdlp && go mod download && rm -rf /tmp/mdlp-deps COPY mdlp-image/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh COPY mdlp-image/process-mods.sh /usr/local/bin/process-mods.sh # 755, not +x: see hacked-build-image/Dockerfile's identical comment - the # entrypoint drops to a `builder` user matching the host's UID/GID, which is # never in these root-owned files' group. RUN chmod 755 /usr/local/bin/docker-entrypoint.sh /usr/local/bin/process-mods.sh WORKDIR /workspace/modding ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] CMD ["/usr/local/bin/process-mods.sh"] # Marks a shell as already running inside this image, same convention as # hacked-build-image/Dockerfile - lets ../Makefile compile directly instead # of trying to docker-run this image again from inside itself. ENV MDLP_IMAGE=1