shields Docker & Self-Hosted Deployment

GitHub

Concise, consistent, and legible badges in SVG and raster format

27,298 stars JavaScript JavaScript 21 files ยท ~30,580 tokens #badge#badge-maker#github#hacktoberfest#metadata#status#svg
1. Pull Image (DOCKERHUB) docker pull badges/shields:latest
2. Docker Run (1-Click Launch) docker run -d --name shields -p 80:80 --restart always badges/shields:latest
3. Podman Run podman run -d --name shields -p 80:80 --restart always badges/shields:latest
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://docker.io/badges/shields:latest
5. ORAS Pull (OCI Artifact) oras pull badges/shields:latest
Dockerfile
FROM node:24-alpine AS builder

RUN npm install -g "npm@^11"

RUN mkdir -p /usr/src/app
RUN mkdir /usr/src/app/private
WORKDIR /usr/src/app

COPY package.json package-lock.json /usr/src/app/
# Without the badge-maker package.json and CLI script in place, `npm ci` will fail.
COPY badge-maker /usr/src/app/badge-maker/

# We need dev deps to build the front end. We don't need Cypress, though.
RUN NODE_ENV=development CYPRESS_INSTALL_BINARY=0 npm ci

COPY . /usr/src/app

RUN npm run build \
    && npm prune --omit=dev --force \
    && rm -rf node_modules/.cache \
    && rm -rf frontend package-lock.json


# Use multi-stage build to reduce size
FROM node:24-alpine

ARG version=dev
ENV DOCKER_SHIELDS_VERSION=$version
LABEL version=$version
LABEL fly.version=$version

# Run the server using production configs.
ENV NODE_ENV=production

WORKDIR /usr/src/app
COPY --from=builder --chown=0:0 /usr/src/app /usr/src/app

CMD ["node", "server"]

EXPOSE 80 443