mirror of
https://github.com/TheNetsky/Microsoft-Rewards-Script.git
synced 2026-01-10 18:36:17 +00:00
* Optimizations of dockerfile
Massive test optimizations with drop in image size to about 256mb from about 1.2 gb. Drawback is that I currently have to keep the dockerfile playwright version matched to the package.json version
* further optimizations
Removed redundant (hopefully) sessions directory creation during build
* Fix docker cron dependencies
Small fix that should make cron run properly
* Major docker update!
- **Dockerfile rewritten as a multi-stage build**
- Split into a “builder” stage (`node:18-slim`) to install dependencies and compile TypeScript, and a “runtime” stage (official Playwright image) to run the script.
- This keeps build tools and dependencies out of the final image, making it smaller, faster to pull, and more secure.
- **Entrypoint script (`entrypoint.sh`)**
- Introduced an entrypoint that runs inside the container at startup to:
1. Set the container’s timezone (`TZ`) correctly, based on the environment or defaulting to UTC.
2. Validate that the user provided a `CRON_SCHEDULE` (exiting early with an error if missing).
3. Optionally perform an initial run of the script immediately (when `RUN_ON_START=true`), without any random sleep.
- Centralizing setup in an entrypoint keeps the Dockerfile simpler and ensures proper signal handling.
- **`run_daily.sh` improvements**
- Removed custom browser-path override so Playwright uses bundled browsers in the official image.
- Added a lock using `flock` to prevent overlapping runs if a previous run is still in progress.
- Retained the random sleep between 5 and 50 minutes before each run.
- Logs are timestamped and clearly report success or failure.
- **Cron template tweaks**
- Updated `src/crontab.template` so that each job line redirects both stdout and stderr into Docker’s stdout (`>> /proc/1/fd/1 2>&1`), making it easy to view logs via `docker logs`.
- **Initial-run logic**
- The entrypoint checks `RUN_ON_START=true` and, if set, invokes `npm start` immediately (without random sleep). This provides an immediate first execution on container startup.
- Scheduled runs via cron still go through the normal `run_daily.sh` (with sleep and locking).
- **Cron logging and visibility**
- By redirecting cron job output to the container’s stdout, all logs (initial run and scheduled runs) appear in `docker logs`, avoiding the need to tail log files manually.
- **Error handling and validation**
- Entry point exits early if `CRON_SCHEDULE` is missing, preventing silent misconfiguration.
- If the initial run fails, it logs a warning but still starts cron so future scheduled runs can proceed.
- `run_daily.sh` will exit early if a previous run is still active (locking), avoiding overlapping executions.
* Docker (multi-stage) improvements
- added cron logging in entrypoint and fixed timezone support for cron-invoked script runs
- further optimized multi-stage dockerfile
- bumped playwright version to 1.52.0 in dockerfile and package.json
- added customization and enable/disable randomization for cron start times
- optionally add container health monitor and resource limits in compose.yaml
69 lines
2.2 KiB
Docker
69 lines
2.2 KiB
Docker
###############################################################################
|
|
# Stage 1: Builder (compile TypeScript)
|
|
###############################################################################
|
|
FROM node:18-slim AS builder
|
|
|
|
WORKDIR /usr/src/microsoft-rewards-script
|
|
|
|
# Install minimal tooling if needed
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Copy package manifests
|
|
COPY package*.json ./
|
|
|
|
# Conditional install: npm ci if lockfile exists, else npm install
|
|
RUN if [ -f package-lock.json ]; then \
|
|
npm ci; \
|
|
else \
|
|
npm install; \
|
|
fi
|
|
|
|
# Copy source code
|
|
COPY . .
|
|
|
|
# Build TypeScript
|
|
RUN npm run build
|
|
|
|
###############################################################################
|
|
# Stage 2: Runtime (Playwright image)
|
|
###############################################################################
|
|
FROM mcr.microsoft.com/playwright:v1.52.0-jammy
|
|
|
|
WORKDIR /usr/src/microsoft-rewards-script
|
|
|
|
# Install cron, gettext-base (for envsubst), tzdata noninteractively
|
|
RUN apt-get update \
|
|
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
|
cron gettext-base tzdata \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Ensure Playwright uses preinstalled browsers
|
|
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
|
|
|
|
# Copy package files first for better caching
|
|
COPY --from=builder /usr/src/microsoft-rewards-script/package*.json ./
|
|
|
|
# Install only production dependencies, with fallback
|
|
RUN if [ -f package-lock.json ]; then \
|
|
npm ci --omit=dev --ignore-scripts; \
|
|
else \
|
|
npm install --production --ignore-scripts; \
|
|
fi
|
|
|
|
# Copy built application
|
|
COPY --from=builder /usr/src/microsoft-rewards-script/dist ./dist
|
|
|
|
# Copy runtime scripts with proper permissions from the start
|
|
COPY --chmod=755 src/run_daily.sh ./src/run_daily.sh
|
|
COPY --chmod=644 src/crontab.template /etc/cron.d/microsoft-rewards-cron.template
|
|
COPY --chmod=755 entrypoint.sh /usr/local/bin/entrypoint.sh
|
|
|
|
# Default TZ (overridden by user via environment)
|
|
ENV TZ=UTC
|
|
|
|
# Entrypoint handles TZ, initial run toggle, cron templating & launch
|
|
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
|
|
CMD ["sh", "-c", "echo 'Container started; cron is running.'"]
|