0e3e3b6c90
- .gitea/workflows/ci.yaml: test on PR/push to master, deploy on push to master - deploy/docker-compose.yml: 15-puzzle container on the edge network with a persistent data volume - Dockerfile: create /data owned by app for the DATA_FILE volume - README: document deployment, required Actions secrets/variables, and persistence
59 lines
1.5 KiB
Docker
59 lines
1.5 KiB
Docker
ARG REPO_URL=docker.io
|
|
ARG IMAGE_BUILDER=golang:1.23.0-alpine3.20
|
|
ARG IMAGE_RUNNER=alpine:3.20
|
|
|
|
## --- Builder
|
|
|
|
FROM ${REPO_URL}/${IMAGE_BUILDER} AS builder
|
|
LABEL stage=builder
|
|
WORKDIR /build
|
|
|
|
ARG GOPROXY_URL
|
|
ENV GOPROXY=${GOPROXY_URL}
|
|
SHELL [ "/bin/sh", "-ec" ]
|
|
|
|
RUN apk add --no-cache make
|
|
|
|
COPY go.mod go.sum Makefile ./
|
|
COPY cmd/ cmd/
|
|
COPY internal/ internal/
|
|
|
|
ENV GOOS=linux
|
|
ENV GOARCH=amd64
|
|
|
|
RUN cp $(go env GOROOT)/misc/wasm/wasm_exec.js .
|
|
|
|
RUN make build
|
|
RUN make build/wasm
|
|
|
|
## --- Runner
|
|
|
|
FROM ${REPO_URL}/${IMAGE_RUNNER}
|
|
|
|
ARG UID=1337
|
|
ARG GID=1337
|
|
ENV APPLICATION_HOME=/home/app \
|
|
TARGET_USER=app \
|
|
TARGET_GROUP=app
|
|
|
|
RUN apk add --no-cache tzdata ; \
|
|
getent group ${GID} || addgroup --gid ${GID} ${TARGET_GROUP} ; \
|
|
adduser -u ${UID} -g ${TARGET_GROUP} -D -S -h ${APPLICATION_HOME} ${TARGET_USER}
|
|
WORKDIR ${APPLICATION_HOME}
|
|
|
|
# Persisted game-data directory (DATA_FILE lives here). A named volume mounted
|
|
# at /data inherits this ownership on first use, so the unprivileged app user
|
|
# can write the temp-file + rename that repo.go performs.
|
|
RUN mkdir -p /data && chown ${TARGET_USER}:${TARGET_GROUP} /data
|
|
|
|
USER ${TARGET_USER}
|
|
|
|
COPY --from=builder /tmp/bin/server /usr/bin/server
|
|
COPY --from=builder --chown=${TARGET_USER}:${TARGET_GROUP} /tmp/bin/game.wasm ./
|
|
COPY --from=builder --chown=${TARGET_USER}:${TARGET_GROUP} /build/wasm_exec.js ./
|
|
COPY --chown=${TARGET_USER}:${TARGET_GROUP} web/*.html ./
|
|
|
|
COPY --chown=${TARGET_USER}:${TARGET_GROUP} entrypoint.sh ./
|
|
|
|
CMD [ "/bin/sh", "/home/app/entrypoint.sh", "/usr/bin/server" ]
|