mirror of
https://github.com/dockersrc/windows
synced 2026-06-24 14:01:03 -04:00
🦈🏠🐜❗ Initial Commit ❗🐜🦈🏠
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
# Files to ignore
|
||||
# Tell docker to ignore .gitkeep
|
||||
.gitkeep
|
||||
# Tell docker to ignore .gitignore
|
||||
.gitignore
|
||||
# Tell docker to ignore node_modules/**
|
||||
node_modules/**
|
||||
# Tell docker to ignore .node_modules/**
|
||||
.node_modules/**
|
||||
# Tell docker to ignore **/.gitkeep
|
||||
**/.gitkeep
|
||||
# Tell docker to ignore **/.gitignore
|
||||
**/.gitignore
|
||||
# Tell docker to ignore **/node_modules/**
|
||||
**/node_modules/**
|
||||
# Tell docker to ignore **/.node_modules/**
|
||||
**/.node_modules/**
|
||||
@@ -0,0 +1,82 @@
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
##@Version : 202601231310-git
|
||||
# @@Author : CasjaysDev
|
||||
# @@Contact : CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @@License : MIT
|
||||
# @@Copyright : Copyright 2026 CasjaysDev
|
||||
# @@Created : Fri Jan 23 01:10:09 PM EST 2026
|
||||
# @@File : .env.scripts
|
||||
# @@Description : Variables for gen-dockerfile and buildx scripts
|
||||
# @@Changelog : newScript
|
||||
# @@TODO : Refactor code
|
||||
# @@Other : N/A
|
||||
# @@Resource : N/A
|
||||
# @@Terminal App : yes
|
||||
# @@sudo/root : yes
|
||||
# @@Template : templates/dockerfiles/dotenv.template
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# shellcheck disable=SC1001,SC1003,SC2001,SC2003,SC2016,SC2031,SC2090,SC2115,SC2120,SC2155,SC2199,SC2229,SC2317,SC2329
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# entrypoint Settings
|
||||
DOCKER_ENTYPOINT_PORTS_WEB="${DOCKER_ENTYPOINT_PORTS_WEB}"
|
||||
DOCKER_ENTYPOINT_PORTS_SRV="${DOCKER_ENTYPOINT_PORTS_SRV}"
|
||||
DOCKER_ENTYPOINT_HEALTH_APPS="$DOCKER_ENTYPOINT_HEALTH_APPS"
|
||||
DOCKER_ENTYPOINT_HEALTH_ENDPOINTS="$DOCKER_ENTYPOINT_HEALTH_ENDPOINTS"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Dockerfile info
|
||||
ENV_DOCKERFILE="Dockerfile"
|
||||
ENV_IMAGE_NAME="windows"
|
||||
ENV_USE_TEMPLATE="alpine"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Maintainer info
|
||||
ENV_ORG_NAME="casjaysdevdocker"
|
||||
ENV_VENDOR="CasjaysDev"
|
||||
ENV_AUTHOR="CasjaysDev"
|
||||
ENV_MAINTAINER="CasjaysDev <docker-admin@casjaysdev.pro>"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Repository URLs (Full URLs)
|
||||
# ENV_GIT_REPO_URL: Complete Git repository URL for source code
|
||||
ENV_GIT_REPO_URL="https://github.com/casjaysdevdocker/windows"
|
||||
# ENV_REGISTRY_URL: Complete registry URL for reference (NOT used for pushing)
|
||||
ENV_REGISTRY_URL="https://hub.docker.com/casjaysdevdocker/windows"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Push Configuration
|
||||
# ENV_IMAGE_PUSH: Complete push destination (this IS used for pushing)
|
||||
ENV_IMAGE_PUSH="casjaysdevdocker/windows"
|
||||
# ENV_IMAGE_TAG: Default tag for the image
|
||||
ENV_IMAGE_TAG="latest"
|
||||
# ENV_ADD_TAGS: Additional tags, comma-separated (USE_DATE = auto date tag)
|
||||
ENV_ADD_TAGS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Additional push destinations (if needed)
|
||||
ENV_ADD_IMAGE_PUSH=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Pull Configuration
|
||||
# ENV_PULL_URL: Source image to pull from (base image)
|
||||
ENV_PULL_URL="mcr.microsoft.com/windows/servercore"
|
||||
# ENV_DISTRO_TAG: Tag for the pull source image
|
||||
ENV_DISTRO_TAG="${IMAGE_VERSION}"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Env
|
||||
SERVICE_PORT=""
|
||||
EXPOSE_PORTS=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# IF using a lanuage such as go, php, rust, ruby, etc set the version here.
|
||||
LANG_VERSION=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Versions
|
||||
PHP_VERSION="system"
|
||||
NODE_VERSION="system"
|
||||
NODE_MANAGER="system"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Default directories
|
||||
WWW_ROOT_DIR="/usr/local/share/httpd/default"
|
||||
DEFAULT_FILE_DIR="/usr/local/share/template-files"
|
||||
DEFAULT_DATA_DIR="/usr/local/share/template-files/data"
|
||||
DEFAULT_CONF_DIR="/usr/local/share/template-files/config"
|
||||
DEFAULT_TEMPLATE_DIR="/usr/local/share/template-files/defaults"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
ENV_PACKAGES=""
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# ex: ts=2 sw=2 et filetype=sh
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
@@ -0,0 +1,86 @@
|
||||
# Template generated on Sat Nov 29 11:57:12 AM EST 2025 from https://github.com/alexkaratarakis/gitattributes"
|
||||
# Common settings that generally should always be used with your language specific settings
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
# The above will handle all files NOT found below
|
||||
# Documents
|
||||
*.bibtex text diff=bibtex
|
||||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
||||
*.md text diff=markdown
|
||||
*.mdx text diff=markdown
|
||||
*.tex text diff=tex
|
||||
*.adoc text
|
||||
*.textile text
|
||||
*.mustache text
|
||||
*.csv text eol=crlf
|
||||
*.tab text
|
||||
*.tsv text
|
||||
*.txt text
|
||||
*.sql text
|
||||
*.epub diff=astextplain
|
||||
# Graphics
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.gif binary
|
||||
*.tif binary
|
||||
*.tiff binary
|
||||
*.ico binary
|
||||
# SVG treated as text by default.
|
||||
*.svg text
|
||||
# If you want to treat it as binary,
|
||||
# use the following line instead.
|
||||
# *.svg binary
|
||||
*.eps binary
|
||||
# Scripts
|
||||
*.bash text eol=lf
|
||||
*.fish text eol=lf
|
||||
*.ksh text eol=lf
|
||||
*.sh text eol=lf
|
||||
*.zsh text eol=lf
|
||||
# These are explicitly windows files and should use crlf
|
||||
*.bat text eol=crlf
|
||||
*.cmd text eol=crlf
|
||||
*.ps1 text eol=crlf
|
||||
# Serialisation
|
||||
*.json text
|
||||
*.toml text
|
||||
*.xml text
|
||||
*.yaml text
|
||||
*.yml text
|
||||
# Archives
|
||||
*.7z binary
|
||||
*.bz binary
|
||||
*.bz2 binary
|
||||
*.bzip2 binary
|
||||
*.gz binary
|
||||
*.lz binary
|
||||
*.lzma binary
|
||||
*.rar binary
|
||||
*.tar binary
|
||||
*.taz binary
|
||||
*.tbz binary
|
||||
*.tbz2 binary
|
||||
*.tgz binary
|
||||
*.tlz binary
|
||||
*.txz binary
|
||||
*.xz binary
|
||||
*.Z binary
|
||||
*.zip binary
|
||||
*.zst binary
|
||||
# Text files where line endings should be preserved
|
||||
*.patch -text
|
||||
# Exclude files from exporting
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
.gitkeep export-ignore
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
name: windows
|
||||
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
release-windows:
|
||||
runs-on: act_runner
|
||||
container:
|
||||
image: catthehacker/ubuntu:act-latest
|
||||
env:
|
||||
RUNNER_TOOL_CACHE: /toolcache
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Get Meta
|
||||
id: meta
|
||||
run: |
|
||||
echo DATE_TAG=$(date +'%y%m') >> $GITHUB_OUTPUT
|
||||
echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT
|
||||
echo DOCKER_ORG=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $1}') >> $GITHUB_OUTPUT
|
||||
echo DOCKER_TAG=$([ -n "$DOCKER_TAG" ] && echo ${DOCKER_TAG} || echo "latest") >> $GITHUB_OUTPUT
|
||||
echo DOCKER_HUB=$([ -n "$DOCKER_HUB" ] && echo ${DOCKER_HUB} || echo "docker.io") >> $GITHUB_OUTPUT
|
||||
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}' | sed 's|^docker-||g') >> $GITHUB_OUTPUT
|
||||
echo "$DOCKER_HUB/$DOCKER_ORG/$REPO_NAME:$DOCKER_TAG"
|
||||
|
||||
- name: Set up Docker BuildX
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
registry: ${{ steps.meta.outputs.DOCKER_HUB }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
platforms: |
|
||||
linux/amd64
|
||||
linux/arm64
|
||||
push: true
|
||||
build-args: |
|
||||
IMAGE_NAME=${{ steps.meta.outputs.REPO_NAME }}
|
||||
BUILD_DATE=$(date -u +'%Y%m%d%H%M')
|
||||
BUILD_VERSION=$(date -u +'%Y%m%d%H%M')
|
||||
GIT_COMMIT=${{ github.sha }}
|
||||
TIMEZONE=America/New_York
|
||||
LANGUAGE=en_US.UTF-8
|
||||
LICENSE=WTFPL
|
||||
TZ=America/New_York
|
||||
tags: |
|
||||
${{ steps.meta.outputs.DOCKER_HUB }}/${{ steps.meta.outputs.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.DATE_TAG }}
|
||||
${{ steps.meta.outputs.DOCKER_HUB }}/${{ steps.meta.outputs.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.DOCKER_TAG }}
|
||||
@@ -0,0 +1,130 @@
|
||||
# GitHub Actions Workflow for Windows Container
|
||||
|
||||
This workflow **fully automates** building Windows Server Core containers using GitHub Actions variables.
|
||||
|
||||
## 🤖 Fully Automated Setup
|
||||
|
||||
### 1. Set Variables (One-time setup)
|
||||
|
||||
**Settings → Secrets and variables → Actions → Variables tab → New repository variable**
|
||||
|
||||
Add this variable:
|
||||
- `DOCKER_USERNAME` - Your Docker Hub username (e.g., `casjaysdevdocker`)
|
||||
|
||||
**Settings → Secrets and variables → Actions → Secrets tab → New repository secret**
|
||||
|
||||
Add this secret:
|
||||
- `DOCKER_PASSWORD` - Your Docker Hub password or access token
|
||||
|
||||
### 2. That's It! 🎉
|
||||
|
||||
The workflow automatically:
|
||||
- ✅ Builds on every push to main/master/develop
|
||||
- ✅ Builds monthly (1st of month at 2 AM UTC)
|
||||
- ✅ Auto-detects repo name from GitHub
|
||||
- ✅ Auto-generates image name: `<username>/<repo-name>`
|
||||
- ✅ Auto-creates tags: `latest` and `YYMM` format
|
||||
- ✅ Auto-extracts metadata from git
|
||||
- ✅ Auto-pushes to Docker Hub (if credentials set)
|
||||
- ✅ Creates build summary in Actions tab
|
||||
|
||||
## 🏷️ Automatic Image Tags
|
||||
|
||||
**Format**: `<DOCKER_USERNAME>/<repo-name>:<tag>`
|
||||
|
||||
Examples for January 2026:
|
||||
- `casjaysdevdocker/windows:latest`
|
||||
- `casjaysdevdocker/windows:2601`
|
||||
|
||||
## ⚙️ Automatic Metadata
|
||||
|
||||
All OCI labels and annotations automatically include:
|
||||
- Build date and time
|
||||
- Git commit hash (short)
|
||||
- Repository URL from GitHub
|
||||
- Docker Hub URL
|
||||
- Version (YYMM format)
|
||||
|
||||
## 🔄 When Builds Run
|
||||
|
||||
1. **On Push** - Any push to main/master/develop branches
|
||||
2. **On Pull Request** - Tests build but doesn't push
|
||||
3. **Monthly** - Automatic rebuild on 1st of each month at 2 AM UTC
|
||||
4. **Manual** - Click "Run workflow" in Actions tab
|
||||
|
||||
## 📊 Build Summary
|
||||
|
||||
After each successful build, check the Actions tab for:
|
||||
- Image name and tags
|
||||
- Build date and commit
|
||||
- Pull command
|
||||
- Image size
|
||||
- All metadata labels
|
||||
|
||||
## 🚫 No Variables? No Problem!
|
||||
|
||||
If `DOCKER_USERNAME` variable is not set:
|
||||
- Falls back to repository owner name
|
||||
- Example: `owner/windows:latest`
|
||||
|
||||
If `DOCKER_PASSWORD` secret is not set:
|
||||
- Build and test still run
|
||||
- Push step is automatically skipped
|
||||
- Perfect for testing or forked repos
|
||||
|
||||
## 📝 Example Output
|
||||
|
||||
```
|
||||
## 📦 Container Build Summary
|
||||
|
||||
**Image:** `casjaysdevdocker/windows`
|
||||
**Tags:**
|
||||
- `latest`
|
||||
- `2601`
|
||||
|
||||
**Build Date:** 202601231800
|
||||
**Commit:** `a1b2c3d`
|
||||
|
||||
### 🚀 Pull Command
|
||||
```powershell
|
||||
docker pull casjaysdevdocker/windows:latest
|
||||
```
|
||||
|
||||
## 🔧 Advanced: Override Image Name
|
||||
|
||||
Want to use a different Docker Hub username? Just set the variable:
|
||||
|
||||
**Settings → Secrets and variables → Actions → Variables**
|
||||
- `DOCKER_USERNAME` = `yourusername`
|
||||
|
||||
Result: `yourusername/windows:latest`
|
||||
|
||||
## 🛠️ Troubleshooting
|
||||
|
||||
### Build succeeds but doesn't push
|
||||
- Check that `DOCKER_PASSWORD` secret is set
|
||||
- Verify `DOCKER_USERNAME` variable or repo owner is correct
|
||||
- Ensure you're not building from a pull request
|
||||
|
||||
### Wrong image name
|
||||
- Set `DOCKER_USERNAME` variable to your Docker Hub username
|
||||
- Or it defaults to GitHub repo owner
|
||||
|
||||
### Need different tags?
|
||||
- Edit `.github/workflows/build-windows.yml`
|
||||
- Modify the `TAG_YYMM` format in the metadata step
|
||||
|
||||
## 📅 Monthly Auto-Build
|
||||
|
||||
The workflow includes a cron schedule:
|
||||
```yaml
|
||||
schedule:
|
||||
- cron: '0 2 1 * *' # 1st of month at 2 AM UTC
|
||||
```
|
||||
|
||||
This ensures:
|
||||
- Fresh base image updates
|
||||
- Latest security patches
|
||||
- Regular image rebuilds
|
||||
|
||||
To disable: Remove the `schedule:` section from the workflow file.
|
||||
@@ -0,0 +1,176 @@
|
||||
name: Build Windows Container
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
- develop
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 2 1 * *' # Build monthly on 1st at 2 AM UTC
|
||||
|
||||
env:
|
||||
REGISTRY: docker.io
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-2022
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
run: |
|
||||
$BUILD_DATE = Get-Date -Format "yyyyMMddHHmm"
|
||||
$TAG_YYMM = Get-Date -Format "yyMM"
|
||||
$GIT_COMMIT = $env:GITHUB_SHA.Substring(0,7)
|
||||
|
||||
# Extract repo name from GITHUB_REPOSITORY (owner/repo)
|
||||
$REPO_NAME = $env:GITHUB_REPOSITORY.Split('/')[1]
|
||||
|
||||
# Get Docker username from variables, fallback to repo owner
|
||||
$DOCKER_USER = "${{ vars.DOCKER_USERNAME }}"
|
||||
if ([string]::IsNullOrWhiteSpace($DOCKER_USER)) {
|
||||
$DOCKER_USER = $env:GITHUB_REPOSITORY.Split('/')[0]
|
||||
}
|
||||
|
||||
$IMAGE_NAME = "$DOCKER_USER/$REPO_NAME"
|
||||
|
||||
echo "BUILD_DATE=$BUILD_DATE" >> $env:GITHUB_ENV
|
||||
echo "TAG_YYMM=$TAG_YYMM" >> $env:GITHUB_ENV
|
||||
echo "GIT_COMMIT=$GIT_COMMIT" >> $env:GITHUB_ENV
|
||||
echo "IMAGE_NAME=$IMAGE_NAME" >> $env:GITHUB_ENV
|
||||
echo "REPO_NAME=$REPO_NAME" >> $env:GITHUB_ENV
|
||||
|
||||
Write-Host "Image Name: $IMAGE_NAME"
|
||||
Write-Host "Build Date: $BUILD_DATE"
|
||||
Write-Host "Tag YYMM: $TAG_YYMM"
|
||||
Write-Host "Git Commit: $GIT_COMMIT"
|
||||
shell: powershell
|
||||
|
||||
- name: Build Docker image with annotations
|
||||
run: |
|
||||
docker build `
|
||||
--build-arg BUILD_DATE=$env:BUILD_DATE `
|
||||
--build-arg GIT_COMMIT=$env:GIT_COMMIT `
|
||||
--label "maintainer=CasjaysDev <docker-admin@casjaysdev.pro>" `
|
||||
--label "org.opencontainers.image.vendor=CasjaysDev" `
|
||||
--label "org.opencontainers.image.authors=CasjaysDev" `
|
||||
--label "org.opencontainers.image.description=Containerized version of $env:REPO_NAME" `
|
||||
--label "org.opencontainers.image.title=$env:REPO_NAME" `
|
||||
--label "org.opencontainers.image.base.name=$env:REPO_NAME" `
|
||||
--label "org.opencontainers.image.licenses=WTFPL" `
|
||||
--label "org.opencontainers.image.created=$env:BUILD_DATE" `
|
||||
--label "org.opencontainers.image.version=$env:TAG_YYMM" `
|
||||
--label "org.opencontainers.image.url=https://hub.docker.com/r/$env:IMAGE_NAME" `
|
||||
--label "org.opencontainers.image.source=$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY" `
|
||||
--label "org.opencontainers.image.vcs-type=Git" `
|
||||
--label "org.opencontainers.image.revision=$env:GIT_COMMIT" `
|
||||
--label "org.opencontainers.image.documentation=$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY" `
|
||||
--label "com.github.containers.toolbox=false" `
|
||||
--annotation "maintainer=CasjaysDev <docker-admin@casjaysdev.pro>" `
|
||||
--annotation "org.opencontainers.image.vendor=CasjaysDev" `
|
||||
--annotation "org.opencontainers.image.authors=CasjaysDev" `
|
||||
--annotation "org.opencontainers.image.description=Containerized version of $env:REPO_NAME" `
|
||||
--annotation "org.opencontainers.image.title=$env:REPO_NAME" `
|
||||
--annotation "org.opencontainers.image.base.name=$env:REPO_NAME" `
|
||||
--annotation "org.opencontainers.image.licenses=WTFPL" `
|
||||
--annotation "org.opencontainers.image.created=$env:BUILD_DATE" `
|
||||
--annotation "org.opencontainers.image.version=$env:TAG_YYMM" `
|
||||
--annotation "org.opencontainers.image.url=https://hub.docker.com/r/$env:IMAGE_NAME" `
|
||||
--annotation "org.opencontainers.image.source=$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY" `
|
||||
--annotation "org.opencontainers.image.vcs-type=Git" `
|
||||
--annotation "org.opencontainers.image.revision=$env:GIT_COMMIT" `
|
||||
--annotation "org.opencontainers.image.documentation=$env:GITHUB_SERVER_URL/$env:GITHUB_REPOSITORY" `
|
||||
--annotation "com.github.containers.toolbox=false" `
|
||||
--tag $env:IMAGE_NAME`:latest `
|
||||
--tag $env:IMAGE_NAME`:$env:TAG_YYMM `
|
||||
.
|
||||
shell: powershell
|
||||
|
||||
- name: Test container
|
||||
run: |
|
||||
Write-Host "Starting container for testing..."
|
||||
docker run -d --name test-container $env:IMAGE_NAME`:latest
|
||||
Start-Sleep -Seconds 10
|
||||
|
||||
Write-Host "Checking container health..."
|
||||
docker ps -a
|
||||
|
||||
$containerStatus = docker inspect test-container --format='{{.State.Status}}'
|
||||
Write-Host "Container status: $containerStatus"
|
||||
|
||||
if ($containerStatus -ne "running") {
|
||||
Write-Host "Container logs:"
|
||||
docker logs test-container
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "Testing healthcheck..."
|
||||
docker exec test-container powershell -Command "C:/Windows/System32/entrypoint.ps1 healthcheck"
|
||||
|
||||
Write-Host "Stopping test container..."
|
||||
docker stop test-container
|
||||
docker rm test-container
|
||||
shell: powershell
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: github.event_name != 'pull_request' && secrets.DOCKER_PASSWORD != ''
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ vars.DOCKER_USERNAME || github.repository_owner }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Push to Docker Hub
|
||||
if: github.event_name != 'pull_request' && secrets.DOCKER_PASSWORD != ''
|
||||
run: |
|
||||
Write-Host "Pushing $env:IMAGE_NAME`:latest..."
|
||||
docker push $env:IMAGE_NAME`:latest
|
||||
|
||||
Write-Host "Pushing $env:IMAGE_NAME`:$env:TAG_YYMM..."
|
||||
docker push $env:IMAGE_NAME`:$env:TAG_YYMM
|
||||
|
||||
Write-Host "=== Images pushed successfully ==="
|
||||
Write-Host "Latest: $env:IMAGE_NAME`:latest"
|
||||
Write-Host "Monthly: $env:IMAGE_NAME`:$env:TAG_YYMM"
|
||||
shell: powershell
|
||||
|
||||
- name: Image details
|
||||
if: always()
|
||||
run: |
|
||||
Write-Host "=== Built Images ==="
|
||||
docker images $env:IMAGE_NAME
|
||||
|
||||
Write-Host "`n=== Image Labels ==="
|
||||
docker inspect $env:IMAGE_NAME`:latest --format='{{json .Config.Labels}}' | ConvertFrom-Json | Format-List
|
||||
|
||||
Write-Host "`n=== Image Size ==="
|
||||
$size = docker images $env:IMAGE_NAME`:latest --format='{{.Size}}'
|
||||
Write-Host "Image size: $size"
|
||||
shell: powershell
|
||||
|
||||
- name: Create release summary
|
||||
if: github.event_name != 'pull_request'
|
||||
run: |
|
||||
Write-Host "## 📦 Container Build Summary" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "**Image:** ``$env:IMAGE_NAME``" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "**Tags:**" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "- ``latest``" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "- ``$env:TAG_YYMM``" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "**Build Date:** $env:BUILD_DATE" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "**Commit:** ``$env:GIT_COMMIT``" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "### 🚀 Pull Command" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host '```powershell' >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host "docker pull $env:IMAGE_NAME`:latest" >> $env:GITHUB_STEP_SUMMARY
|
||||
Write-Host '```' >> $env:GITHUB_STEP_SUMMARY
|
||||
shell: powershell
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
# gitignore created on 01/23/26 at 13:10
|
||||
# Disable reminder in prompt
|
||||
ignoredirmessage
|
||||
|
||||
# ignore .build_failed files
|
||||
**/.build_failed*
|
||||
|
||||
# OS generated files
|
||||
### Linux ###
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
### macOS ###
|
||||
# General
|
||||
.DS_Store?
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
### macOS Patch ###
|
||||
# iCloud generated files
|
||||
*.icloud
|
||||
|
||||
### Windows ###
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# misc
|
||||
!*/README*
|
||||
!inc/main.bash
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
# ignore commit message
|
||||
**/.gitcommit
|
||||
|
||||
# ignore .build_failed files
|
||||
**/.build_failed*
|
||||
|
||||
# ignore .bak files
|
||||
**/*.bak
|
||||
|
||||
# ignore .no_push files
|
||||
**/.no_push
|
||||
|
||||
# ignore .no_git files
|
||||
**/.no_git
|
||||
|
||||
# ignore .installed files
|
||||
**/.installed
|
||||
|
||||
# ignore work in progress files
|
||||
**/*.rewrite.sh
|
||||
**/*.refactor.sh
|
||||
|
||||
+228
@@ -0,0 +1,228 @@
|
||||
# Docker image for windows using Windows Server Core
|
||||
ARG IMAGE_NAME="windows"
|
||||
ARG PHP_SERVER="windows"
|
||||
ARG BUILD_DATE="202601231310"
|
||||
ARG LANGUAGE="en-US"
|
||||
ARG TIMEZONE="Eastern Standard Time"
|
||||
ARG WWW_ROOT_DIR="C:/inetpub/wwwroot"
|
||||
ARG DEFAULT_FILE_DIR="C:/ProgramData/template-files"
|
||||
ARG DEFAULT_DATA_DIR="C:/ProgramData/template-files/data"
|
||||
ARG DEFAULT_CONF_DIR="C:/ProgramData/template-files/config"
|
||||
ARG DEFAULT_TEMPLATE_DIR="C:/ProgramData/template-files/defaults"
|
||||
|
||||
ARG USER="Administrator"
|
||||
ARG SHELL_OPTS=""
|
||||
|
||||
ARG SERVICE_PORT=""
|
||||
ARG EXPOSE_PORTS=""
|
||||
ARG PHP_VERSION="system"
|
||||
ARG NODE_VERSION="system"
|
||||
ARG NODE_MANAGER="system"
|
||||
|
||||
ARG IMAGE_REPO="casjaysdevdocker/windows"
|
||||
ARG IMAGE_VERSION="ltsc2022"
|
||||
ARG CONTAINER_VERSION=""
|
||||
|
||||
ARG PULL_URL="mcr.microsoft.com/windows/servercore"
|
||||
ARG DISTRO_VERSION="${IMAGE_VERSION}"
|
||||
ARG BUILD_VERSION="${BUILD_DATE}"
|
||||
|
||||
FROM ${PULL_URL}:${DISTRO_VERSION} AS build
|
||||
ARG TZ
|
||||
ARG USER
|
||||
ARG LICENSE
|
||||
ARG TIMEZONE
|
||||
ARG LANGUAGE
|
||||
ARG IMAGE_NAME
|
||||
ARG BUILD_DATE
|
||||
ARG SERVICE_PORT
|
||||
ARG EXPOSE_PORTS
|
||||
ARG BUILD_VERSION
|
||||
ARG IMAGE_VERSION
|
||||
ARG WWW_ROOT_DIR
|
||||
ARG DEFAULT_FILE_DIR
|
||||
ARG DEFAULT_DATA_DIR
|
||||
ARG DEFAULT_CONF_DIR
|
||||
ARG DEFAULT_TEMPLATE_DIR
|
||||
ARG DISTRO_VERSION
|
||||
ARG NODE_VERSION
|
||||
ARG NODE_MANAGER
|
||||
ARG PHP_VERSION
|
||||
ARG PHP_SERVER
|
||||
ARG SHELL_OPTS
|
||||
ARG PATH
|
||||
|
||||
ARG PACK_LIST=" "
|
||||
|
||||
ENV TIMEZONE="${TIMEZONE}"
|
||||
ENV LANG="${LANGUAGE}"
|
||||
ENV HOSTNAME="casjaysdevdocker-windows"
|
||||
|
||||
USER ${USER}
|
||||
WORKDIR C:/Users/Administrator
|
||||
|
||||
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
|
||||
|
||||
COPY ./rootfs/. C:/
|
||||
|
||||
RUN Write-Host 'Setting up prerequisites'; \
|
||||
New-Item -ItemType Directory -Force -Path $env:DEFAULT_DATA_DIR, $env:DEFAULT_CONF_DIR, $env:DEFAULT_TEMPLATE_DIR, 'C:/ProgramData/Docker/setup' | Out-Null
|
||||
|
||||
RUN Write-Host 'Initializing the system'; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/00-init.ps1') { \
|
||||
Write-Host 'Running the init script'; \
|
||||
& 'C:/ProgramData/Docker/setup/00-init.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 00-init.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the init script'; \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Creating and editing system files'; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/01-system.ps1') { \
|
||||
Write-Host 'Running the system script'; \
|
||||
& 'C:/ProgramData/Docker/setup/01-system.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 01-system.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the system script'; \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Running pre-package commands'
|
||||
|
||||
RUN Write-Host 'Setting up and installing packages'; \
|
||||
if ($env:PACK_LIST -and $env:PACK_LIST.Trim() -ne '') { \
|
||||
Write-Host "Installing packages: $env:PACK_LIST"; \
|
||||
$env:PACK_LIST | Out-File -FilePath 'C:/ProgramData/Docker/setup/packages.txt' -Encoding UTF8; \
|
||||
& 'C:/Windows/System32/pkmgr.ps1' install $env:PACK_LIST.Split(' '); \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Initializing packages before copying files to image'; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/02-packages.ps1') { \
|
||||
Write-Host 'Running the packages script'; \
|
||||
& 'C:/ProgramData/Docker/setup/02-packages.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 02-packages.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the packages script'; \
|
||||
}
|
||||
|
||||
COPY ./Dockerfile C:/ProgramData/Docker/Dockerfile
|
||||
|
||||
RUN Write-Host 'Updating system files'; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/03-files.ps1') { \
|
||||
Write-Host 'Running the files script'; \
|
||||
& 'C:/ProgramData/Docker/setup/03-files.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 03-files.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the files script'; \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Custom Settings'
|
||||
|
||||
RUN Write-Host 'Setting up users and scripts'; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/04-users.ps1') { \
|
||||
Write-Host 'Running the users script'; \
|
||||
& 'C:/ProgramData/Docker/setup/04-users.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 04-users.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the users script'; \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Running the user init commands'
|
||||
|
||||
RUN Write-Host 'Setting OS Settings'
|
||||
|
||||
RUN Write-Host 'Custom Applications'
|
||||
|
||||
RUN Write-Host 'Running custom commands'; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/05-custom.ps1') { \
|
||||
Write-Host 'Running the custom script'; \
|
||||
& 'C:/ProgramData/Docker/setup/05-custom.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 05-custom.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the custom script'; \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Running final commands before cleanup'; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/06-post.ps1') { \
|
||||
Write-Host 'Running the post script'; \
|
||||
& 'C:/ProgramData/Docker/setup/06-post.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 06-post.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the post script'; \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Deleting unneeded files'; \
|
||||
& 'C:/Windows/System32/pkmgr.ps1' clean; \
|
||||
Remove-Item -Path 'C:/config', 'C:/data' -Recurse -Force -ErrorAction SilentlyContinue; \
|
||||
if (Test-Path 'C:/ProgramData/Docker/setup/07-cleanup.ps1') { \
|
||||
Write-Host 'Running the cleanup script'; \
|
||||
& 'C:/ProgramData/Docker/setup/07-cleanup.ps1'; \
|
||||
if ($LASTEXITCODE -ne 0) { Write-Error 'Failed to execute 07-cleanup.ps1'; exit 10 }; \
|
||||
Write-Host 'Done running the cleanup script'; \
|
||||
}
|
||||
|
||||
RUN Write-Host 'Init done'
|
||||
|
||||
FROM mcr.microsoft.com/windows/servercore:ltsc2022
|
||||
ARG TZ
|
||||
ARG PATH
|
||||
ARG USER
|
||||
ARG TIMEZONE
|
||||
ARG LANGUAGE
|
||||
ARG IMAGE_NAME
|
||||
ARG BUILD_DATE
|
||||
ARG SERVICE_PORT
|
||||
ARG EXPOSE_PORTS
|
||||
ARG BUILD_VERSION
|
||||
ARG IMAGE_VERSION
|
||||
ARG GIT_COMMIT
|
||||
ARG WWW_ROOT_DIR
|
||||
ARG DEFAULT_FILE_DIR
|
||||
ARG DEFAULT_DATA_DIR
|
||||
ARG DEFAULT_CONF_DIR
|
||||
ARG DEFAULT_TEMPLATE_DIR
|
||||
ARG DISTRO_VERSION
|
||||
ARG NODE_VERSION
|
||||
ARG NODE_MANAGER
|
||||
ARG PHP_VERSION
|
||||
ARG PHP_SERVER
|
||||
ARG LICENSE="WTFPL"
|
||||
ARG ENV_PORTS="${EXPOSE_PORTS}"
|
||||
|
||||
USER ${USER}
|
||||
WORKDIR C:/Users/Administrator
|
||||
|
||||
LABEL maintainer="CasjaysDev <docker-admin@casjaysdev.pro>"
|
||||
LABEL org.opencontainers.image.vendor="CasjaysDev"
|
||||
LABEL org.opencontainers.image.authors="CasjaysDev"
|
||||
LABEL org.opencontainers.image.description="Containerized version of ${IMAGE_NAME}"
|
||||
LABEL org.opencontainers.image.title="${IMAGE_NAME}"
|
||||
LABEL org.opencontainers.image.base.name="${IMAGE_NAME}"
|
||||
LABEL org.opencontainers.image.authors="${LICENSE}"
|
||||
LABEL org.opencontainers.image.created="${BUILD_DATE}"
|
||||
LABEL org.opencontainers.image.version="${BUILD_VERSION}"
|
||||
LABEL org.opencontainers.image.schema-version="${BUILD_VERSION}"
|
||||
LABEL org.opencontainers.image.url="https://hub.docker.com/casjaysdevdocker/windows"
|
||||
LABEL org.opencontainers.image.source="https://hub.docker.com/casjaysdevdocker/windows"
|
||||
LABEL org.opencontainers.image.vcs-type="Git"
|
||||
LABEL org.opencontainers.image.revision="${GIT_COMMIT}"
|
||||
LABEL org.opencontainers.image.source="https://github.com/casjaysdevdocker/windows"
|
||||
LABEL org.opencontainers.image.documentation="https://github.com/casjaysdevdocker/windows"
|
||||
LABEL com.github.containers.toolbox="false"
|
||||
|
||||
ENV USER="${USER}"
|
||||
ENV TIMEZONE="${TIMEZONE}"
|
||||
ENV LANG="${LANGUAGE}"
|
||||
ENV PORT="${SERVICE_PORT}"
|
||||
ENV ENV_PORTS="${ENV_PORTS}"
|
||||
ENV CONTAINER_NAME="${IMAGE_NAME}"
|
||||
ENV HOSTNAME="casjaysdev-${IMAGE_NAME}"
|
||||
ENV PHP_SERVER="${PHP_SERVER}"
|
||||
ENV NODE_VERSION="${NODE_VERSION}"
|
||||
ENV NODE_MANAGER="${NODE_MANAGER}"
|
||||
ENV PHP_VERSION="${PHP_VERSION}"
|
||||
ENV DISTRO_VERSION="${IMAGE_VERSION}"
|
||||
ENV WWW_ROOT_DIR="${WWW_ROOT_DIR}"
|
||||
|
||||
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
|
||||
|
||||
COPY --from=build C:/ C:/
|
||||
|
||||
VOLUME ["C:/config", "C:/data"]
|
||||
|
||||
EXPOSE ${SERVICE_PORT} ${ENV_PORTS}
|
||||
|
||||
ENTRYPOINT ["powershell", "-File", "C:/Windows/System32/entrypoint.ps1"]
|
||||
HEALTHCHECK --start-period=10m --interval=5m --timeout=15s CMD powershell -File C:/Windows/System32/entrypoint.ps1 healthcheck
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2026 casjay <git-admin@casjaysdev.pro>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
1. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
@@ -0,0 +1,106 @@
|
||||
## 👋 Welcome to windows 🚀
|
||||
|
||||
Windows Server Core Container for running Windows applications in Docker.
|
||||
|
||||
⚠️ **IMPORTANT**: This container requires a Windows host to build and run. It will NOT work on Linux or macOS.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Windows Server 2022 or Windows 10/11 Pro with containers feature enabled
|
||||
- Docker Desktop for Windows (with Windows containers enabled)
|
||||
- At least 10GB free disk space for the image
|
||||
|
||||
## Install and run container
|
||||
|
||||
```powershell
|
||||
# Create directories
|
||||
$dockerHome = "C:\docker\casjaysdevdocker\windows"
|
||||
New-Item -ItemType Directory -Force -Path "$dockerHome\data", "$dockerHome\config"
|
||||
|
||||
# Run container
|
||||
docker run -d `
|
||||
--restart always `
|
||||
--name casjaysdevdocker-windows-latest `
|
||||
--hostname windows `
|
||||
-e TIMEZONE="Eastern Standard Time" `
|
||||
-v "$dockerHome\data:C:\data" `
|
||||
-v "$dockerHome\config:C:\config" `
|
||||
-p 80:80 `
|
||||
casjaysdevdocker/windows:latest
|
||||
```
|
||||
|
||||
## via docker-compose
|
||||
|
||||
```yaml
|
||||
version: "3.8"
|
||||
services:
|
||||
windows:
|
||||
image: casjaysdevdocker/windows:latest
|
||||
container_name: casjaysdevdocker-windows
|
||||
environment:
|
||||
- TIMEZONE=Eastern Standard Time
|
||||
- HOSTNAME=windows
|
||||
volumes:
|
||||
- "C:/docker/casjaysdevdocker/windows/data:C:/data"
|
||||
- "C:/docker/casjaysdevdocker/windows/config:C:/config"
|
||||
ports:
|
||||
- "80:80"
|
||||
restart: always
|
||||
```
|
||||
|
||||
## Get source files
|
||||
|
||||
```powershell
|
||||
git clone "https://github.com/casjaysdevdocker/windows" "$env:USERPROFILE\Projects\casjaysdevdocker\windows"
|
||||
```
|
||||
|
||||
## Build container
|
||||
|
||||
⚠️ **Must be built on Windows with Docker Desktop in Windows containers mode**
|
||||
|
||||
```powershell
|
||||
cd "$env:USERPROFILE\Projects\casjaysdevdocker\windows"
|
||||
docker build -t casjaysdevdocker/windows:latest .
|
||||
```
|
||||
|
||||
## Package Management
|
||||
|
||||
This container uses **winget** (Windows Package Manager) or **chocolatey** as fallback. To install packages:
|
||||
|
||||
```powershell
|
||||
# Via pkmgr wrapper (recommended)
|
||||
docker exec casjaysdevdocker-windows-latest powershell "C:/Windows/System32/pkmgr.ps1 install git.git"
|
||||
docker exec casjaysdevdocker-windows-latest powershell "C:/Windows/System32/pkmgr.ps1 install nodejs"
|
||||
|
||||
# Direct via winget
|
||||
docker exec casjaysdevdocker-windows-latest powershell "winget install git.git"
|
||||
```
|
||||
|
||||
## Container Structure
|
||||
|
||||
```
|
||||
C:/
|
||||
├── ProgramData/
|
||||
│ ├── Docker/setup/ - Setup scripts (00-init.ps1 to 07-cleanup.ps1)
|
||||
│ └── template-files/ - Configuration templates
|
||||
├── Windows/System32/
|
||||
│ ├── entrypoint.ps1 - Container entrypoint
|
||||
│ ├── pkmgr.ps1 - Package manager wrapper
|
||||
│ └── pkmgr - Shell script version
|
||||
├── Users/Administrator/ - User home directory
|
||||
├── config/ - Configuration volume mount
|
||||
└── data/ - Data volume mount
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
- `TIMEZONE` - Windows timezone (default: "Eastern Standard Time")
|
||||
- `HOSTNAME` - Container hostname
|
||||
- `LANG` - Language setting (default: "en-US")
|
||||
- `SERVICE_PORT` - Primary service port
|
||||
- `ENV_PORTS` - Additional exposed ports
|
||||
|
||||
## Authors
|
||||
|
||||
🤖 casjay: [Github](https://github.com/casjay) 🤖
|
||||
⛵ casjaysdevdocker: [Github](https://github.com/casjaysdevdocker) [Docker](https://hub.docker.com/u/casjaysdevdocker) ⛵
|
||||
@@ -0,0 +1,26 @@
|
||||
# PowerShell script for Windows container initialization
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 00-init.ps1
|
||||
# @Description: Script to run init
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# Predefined actions - Clear template directories
|
||||
if (Test-Path 'C:/ProgramData/template-files/data') {
|
||||
Get-ChildItem 'C:/ProgramData/template-files/data' -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
if (Test-Path 'C:/ProgramData/template-files/config') {
|
||||
Get-ChildItem 'C:/ProgramData/template-files/config' -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
if (Test-Path 'C:/ProgramData/template-files/defaults') {
|
||||
Get-ChildItem 'C:/ProgramData/template-files/defaults' -Recurse -ErrorAction SilentlyContinue | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
# Main script logic here
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,15 @@
|
||||
# PowerShell script for Windows container system setup
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 01-system.ps1
|
||||
# @Description: Script to run system setup
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# System configuration here
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,15 @@
|
||||
# PowerShell script for Windows container package setup
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 02-packages.ps1
|
||||
# @Description: Script to run package initialization
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# Package initialization here
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,15 @@
|
||||
# PowerShell script for Windows container files setup
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 03-files.ps1
|
||||
# @Description: Script to configure system files
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# File configuration here
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,15 @@
|
||||
# PowerShell script for Windows container user setup
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 04-users.ps1
|
||||
# @Description: Script to configure users
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# User configuration here
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,15 @@
|
||||
# PowerShell script for Windows container custom setup
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 05-custom.ps1
|
||||
# @Description: Script for custom configurations
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# Custom configuration here
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,15 @@
|
||||
# PowerShell script for Windows container post setup
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 06-post.ps1
|
||||
# @Description: Script for post-installation tasks
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# Post-installation tasks here
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,23 @@
|
||||
# PowerShell script for Windows container cleanup
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: MIT
|
||||
# @Copyright: Copyright 2026 CasjaysDev
|
||||
# @File: 07-cleanup.ps1
|
||||
# @Description: Script for cleanup tasks
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$exitCode = 0
|
||||
|
||||
# Clean Windows temp files
|
||||
Remove-Item -Path 'C:\Windows\Temp\*' -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item -Path 'C:\Users\*\AppData\Local\Temp\*' -Recurse -Force -ErrorAction SilentlyContinue
|
||||
|
||||
# Clean package caches
|
||||
if (Get-Command winget -ErrorAction SilentlyContinue) {
|
||||
# Winget doesn't have explicit cache clean yet
|
||||
Write-Host 'Winget cache management'
|
||||
}
|
||||
|
||||
exit $exitCode
|
||||
@@ -0,0 +1,101 @@
|
||||
# PowerShell entrypoint for Windows container
|
||||
# @Version: 202601231310-git
|
||||
# @Author: CasjaysDev
|
||||
# @Contact: CasjaysDev <docker-admin@casjaysdev.pro>
|
||||
# @License: WTFPL
|
||||
# @Copyright: Copyright (c) 2026 Jason Hempstead, Casjays Developments
|
||||
# @File: entrypoint.ps1
|
||||
# @Description: Entrypoint file for windows container
|
||||
|
||||
param(
|
||||
[string]$Command = ""
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$SERVICE_PID_FILE = "C:\ProgramData\container.pid"
|
||||
$SERVICE_IS_RUNNING = "no"
|
||||
|
||||
# Trap handler for cleanup
|
||||
trap {
|
||||
Write-Host "Container received shutdown signal"
|
||||
if ($SERVICE_IS_RUNNING -ne "yes" -and (Test-Path $SERVICE_PID_FILE)) {
|
||||
Remove-Item -Path $SERVICE_PID_FILE -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Load debug configuration
|
||||
if (Test-Path "C:\config\.debug") {
|
||||
$env:DEBUGGER_OPTIONS = Get-Content "C:\config\.debug" -Raw
|
||||
} else {
|
||||
$env:DEBUGGER_OPTIONS = ""
|
||||
}
|
||||
|
||||
if ($env:DEBUGGER -eq "on" -or (Test-Path "C:\config\.debug")) {
|
||||
$VerbosePreference = 'Continue'
|
||||
$DebugPreference = 'Continue'
|
||||
Write-Host "Debugging enabled"
|
||||
}
|
||||
|
||||
# Function to check service health
|
||||
function Test-ServiceHealth {
|
||||
# Add health check logic here
|
||||
# Return $true if healthy, $false otherwise
|
||||
return $true
|
||||
}
|
||||
|
||||
# Handle commands
|
||||
switch ($Command.ToLower()) {
|
||||
"healthcheck" {
|
||||
if (Test-ServiceHealth) {
|
||||
Write-Host "Service is healthy"
|
||||
exit 0
|
||||
} else {
|
||||
Write-Host "Service is unhealthy"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
"version" {
|
||||
Write-Host "Windows Container Version: $env:BUILD_VERSION"
|
||||
Write-Host "Distro: Windows Server Core $env:DISTRO_VERSION"
|
||||
exit 0
|
||||
}
|
||||
default {
|
||||
# Default startup behavior
|
||||
Write-Host "Starting Windows container..."
|
||||
Write-Host "Hostname: $env:HOSTNAME"
|
||||
Write-Host "Timezone: $env:TIMEZONE"
|
||||
|
||||
# Set timezone
|
||||
try {
|
||||
if ($env:TIMEZONE) {
|
||||
& tzutil.exe /s $env:TIMEZONE
|
||||
Write-Host "Timezone set to: $env:TIMEZONE"
|
||||
}
|
||||
} catch {
|
||||
Write-Warning "Failed to set timezone: $_"
|
||||
}
|
||||
|
||||
# Create PID file
|
||||
$PID | Out-File -FilePath $SERVICE_PID_FILE -Encoding ASCII
|
||||
$global:SERVICE_IS_RUNNING = "yes"
|
||||
|
||||
# Keep container running
|
||||
Write-Host "Container started successfully"
|
||||
Write-Host "Press Ctrl+C to stop"
|
||||
|
||||
# Run any startup commands here
|
||||
|
||||
# Keep alive loop
|
||||
try {
|
||||
while ($true) {
|
||||
Start-Sleep -Seconds 60
|
||||
}
|
||||
} finally {
|
||||
# Cleanup
|
||||
if (Test-Path $SERVICE_PID_FILE) {
|
||||
Remove-Item -Path $SERVICE_PID_FILE -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+155
@@ -0,0 +1,155 @@
|
||||
#!/usr/bin/env sh
|
||||
# shellcheck shell=sh
|
||||
# shellcheck disable=SC2016
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
USER_UID="$(id -u 2>/dev/null || echo 0)"
|
||||
USER_GID="$(id -g 2>/dev/null || echo 0)"
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# Detect package manager
|
||||
if [ -x "$(command -v winget 2>/dev/null)" ]; then
|
||||
pkmgr_cmd="winget"
|
||||
pkmgr_clean_cmd="true"
|
||||
pkmgr_mkcache_cmd="true"
|
||||
pkmgr_update_cmd="$pkmgr_cmd upgrade --all --accept-source-agreements --accept-package-agreements"
|
||||
pkmgr_install_cmd="$pkmgr_cmd install --accept-source-agreements --accept-package-agreements $PKMGR_OPTS"
|
||||
elif [ -x "$(command -v choco 2>/dev/null)" ]; then
|
||||
pkmgr_cmd="choco"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd cache clean"
|
||||
pkmgr_mkcache_cmd="true"
|
||||
pkmgr_update_cmd="$pkmgr_cmd upgrade all -y"
|
||||
pkmgr_install_cmd="$pkmgr_cmd install -y $PKMGR_OPTS"
|
||||
elif [ -x "$(command -v apt 2>/dev/null)" ]; then
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
pkmgr_cmd="apt"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd clean"
|
||||
pkmgr_mkcache_cmd="$pkmgr_cmd update"
|
||||
pkmgr_update_cmd="$pkmgr_cmd upgrade -yy"
|
||||
pkmgr_install_cmd="$pkmgr_cmd install -yy $PKMGR_OPTS"
|
||||
pkmgr_install_post="$pkmgr_cmd --fix-broken install"
|
||||
elif [ -x "$(command -v apt-get 2>/dev/null)" ]; then
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
pkmgr_cmd="apt-get"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd clean"
|
||||
pkmgr_mkcache_cmd="$pkmgr_cmd update"
|
||||
pkmgr_update_cmd="$pkmgr_cmd upgrade -yy"
|
||||
pkmgr_install_cmd="$pkmgr_cmd install -yy $PKMGR_OPTS"
|
||||
pkmgr_install_post="$pkmgr_cmd --fix-broken install"
|
||||
elif [ -x "$(command -v dnf 2>/dev/null)" ]; then
|
||||
pkmgr_cmd="dnf"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd clean all"
|
||||
pkmgr_mkcache_cmd="$pkmgr_cmd makecache"
|
||||
pkmgr_update_cmd="$pkmgr_cmd update -y --skip-broken $PKMGR_OPTS"
|
||||
pkmgr_install_cmd="$pkmgr_cmd install -y --skip-broken $PKMGR_OPTS"
|
||||
elif [ -x "$(command -v yum 2>/dev/null)" ]; then
|
||||
pkmgr_cmd="yum"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd clean all"
|
||||
pkmgr_mkcache_cmd="$pkmgr_cmd makecache"
|
||||
pkmgr_update_cmd="$pkmgr_cmd update -y --skip-broken $PKMGR_OPTS"
|
||||
pkmgr_install_cmd="$pkmgr_cmd install -y --skip-broken $PKMGR_OPTS"
|
||||
elif [ -n "$(command -v pacman 2>/dev/null)" ]; then
|
||||
pkmgr_cmd="pacman"
|
||||
pkmgr_mkcache_cmd="true"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd -Scc --noconfirm"
|
||||
pkmgr_update_cmd="$pkmgr_cmd -Syyu --noconfirm $PKMGR_OPTS"
|
||||
pkmgr_install_cmd="$pkmgr_cmd -Syy --noconfirm $PKMGR_OPTS"
|
||||
elif [ -x "$(command -v apk 2>/dev/null)" ]; then
|
||||
pkmgr_cmd="apk"
|
||||
pkmgr_mkcache_cmd="true"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd cache clean"
|
||||
pkmgr_update_cmd="$pkmgr_cmd -U upgrade --no-cache $PKMGR_OPTS"
|
||||
pkmgr_install_cmd="$pkmgr_cmd add --no-cache $PKMGR_OPTS"
|
||||
elif [ -x "$(command -v zypper 2>/dev/null)" ]; then
|
||||
pkmgr_cmd="zypper"
|
||||
pkmgr_mkcache_cmd="true"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd clean --all"
|
||||
pkmgr_update_cmd="$pkmgr_cmd update -y $PKMGR_OPTS"
|
||||
pkmgr_install_cmd="$pkmgr_cmd install -y $PKMGR_OPTS"
|
||||
else
|
||||
pkmgr_cmd="true"
|
||||
pkmgr_mkcache_cmd="$pkmgr_cmd"
|
||||
pkmgr_clean_cmd="$pkmgr_cmd"
|
||||
pkmgr_update_cmd="$pkmgr_cmd"
|
||||
pkmgr_install_cmd="$pkmgr_cmd"
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
if [ -f "C:/config/pkmgr/settings.conf" ]; then
|
||||
. "C:/config/pkmgr/settings.conf"
|
||||
elif [ -f "C:/ProgramData/pkmgr/settings.conf" ]; then
|
||||
. "C:/ProgramData/pkmgr/settings.conf"
|
||||
else
|
||||
mkdir -p "C:/config/pkmgr"
|
||||
cat <<EEOF >"C:/config/pkmgr/settings.conf"
|
||||
pkmgr_cmd="$pkmgr_cmd"
|
||||
pkmgr_clean_cmd="$pkmgr_clean_cmd"
|
||||
pkmgr_update_cmd="$pkmgr_update_cmd"
|
||||
pkmgr_install_cmd="$pkmgr_install_cmd"
|
||||
pkmgr_mkcache_cmd="$pkmgr_mkcache_cmd"
|
||||
EEOF
|
||||
fi
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
[ -n "$pkmgr_cmd" ] || { echo "Can not determine the package manager" && exit 1; }
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
case "$1" in
|
||||
pip)
|
||||
shift 1
|
||||
pip_bin="$(command -v python3 2>/dev/null || command -v python2 2>/dev/null || command -v python 2>/dev/null || echo "")"
|
||||
py_version="$($pip_bin --version | sed 's|[pP]ython ||g' | awk -F '.' '{print $1$2}' | grep '[0-9]' || echo "0")"
|
||||
[ "$py_version" -gt "310" ] && pip_opts="--break-system-packages " || pip_opts=""
|
||||
case "$1" in
|
||||
install)
|
||||
shift 1
|
||||
pkg_list="$*"
|
||||
for pkg in $pkg_list; do
|
||||
$pip_bin -m pip $pip_opts "$pkg"
|
||||
done
|
||||
;;
|
||||
*)
|
||||
for pkg in "$@"; do
|
||||
$pip_bin -m pip "$pkg"
|
||||
done
|
||||
;;
|
||||
esac
|
||||
exit
|
||||
;;
|
||||
install)
|
||||
shift 1
|
||||
[ -n "$1" ] || exit 0
|
||||
[ "$USER_UID" -eq 0 ] || [ "$USER" = "root" ] || pkmgr_install_cmd="sudo $pkmgr_install_cmd"
|
||||
if [ -f "$1" ]; then
|
||||
install_list="$(cat "$1")"
|
||||
else
|
||||
install_list="$*"
|
||||
fi
|
||||
for pkg in $install_list;do
|
||||
echo "installing packages command: $pkmgr_install_cmd $pkg"
|
||||
$pkmgr_install_cmd $pkg
|
||||
if [ -n "$pkmgr_install_post" ]; then eval $pkmgr_install_post; fi
|
||||
done
|
||||
exit
|
||||
;;
|
||||
update | upgrade)
|
||||
shift $#
|
||||
[ "$USER_UID" -eq 0 ] || [ "$USER" = "root" ] || pkmgr_update_cmd="sudo $pkmgr_install_cmd"
|
||||
echo "Updating packages command: $pkmgr_update_cmd"
|
||||
$pkmgr_mkcache_cmd
|
||||
$pkmgr_update_cmd
|
||||
exit $?
|
||||
;;
|
||||
clean)
|
||||
shift $#
|
||||
[ -n "$1" ] || exit 0
|
||||
[ "$USER_UID" -eq 0 ] || [ "$USER" = "root" ] || pkmgr_clean_cmd="sudo $pkmgr_clean_cmd"
|
||||
echo "Cleaning package cache: $pkmgr_clean_cmd"
|
||||
$pkmgr_clean_cmd
|
||||
exit $?
|
||||
;;
|
||||
*)
|
||||
[ -n "$1" ] || exit 0
|
||||
[ "$USER_UID" -eq 0 ] || [ "$USER" = "root" ] || pkmgr_cmd="sudo $pkmgr_cmd"
|
||||
echo "executing packages command: $pkmgr_cmd $*"
|
||||
$pkmgr_cmd "$@"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
# - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
# end
|
||||
@@ -0,0 +1,102 @@
|
||||
# PowerShell Package Manager Wrapper
|
||||
# Supports winget, chocolatey, and can be extended
|
||||
param(
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$Action = "",
|
||||
[Parameter(ValueFromRemainingArguments=$true)]
|
||||
[string[]]$Packages
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
# Detect package manager
|
||||
$pkgMgr = $null
|
||||
$installCmd = $null
|
||||
$updateCmd = $null
|
||||
$cleanCmd = $null
|
||||
|
||||
if (Get-Command winget -ErrorAction SilentlyContinue) {
|
||||
$pkgMgr = "winget"
|
||||
$installCmd = { param($pkg) & winget install --id $pkg --accept-source-agreements --accept-package-agreements --silent }
|
||||
$updateCmd = { & winget upgrade --all --accept-source-agreements --accept-package-agreements --silent }
|
||||
$cleanCmd = { Write-Host "Winget cache management" }
|
||||
} elseif (Get-Command choco -ErrorAction SilentlyContinue) {
|
||||
$pkgMgr = "chocolatey"
|
||||
$installCmd = { param($pkg) & choco install $pkg -y }
|
||||
$updateCmd = { & choco upgrade all -y }
|
||||
$cleanCmd = { & choco cache clean }
|
||||
} else {
|
||||
Write-Error "No package manager found. Please install winget or chocolatey."
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "Using package manager: $pkgMgr"
|
||||
|
||||
# Load config if exists
|
||||
$configPath = "C:\config\pkmgr\settings.ps1"
|
||||
if (Test-Path $configPath) {
|
||||
. $configPath
|
||||
}
|
||||
|
||||
# Handle commands
|
||||
switch ($Action.ToLower()) {
|
||||
"install" {
|
||||
if (-not $Packages -or $Packages.Count -eq 0) {
|
||||
Write-Warning "No packages specified"
|
||||
exit 0
|
||||
}
|
||||
|
||||
foreach ($pkg in $Packages) {
|
||||
if ($pkg.Trim() -ne "") {
|
||||
Write-Host "Installing package: $pkg"
|
||||
try {
|
||||
& $installCmd $pkg
|
||||
} catch {
|
||||
Write-Error "Failed to install $pkg : $_"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"update" {
|
||||
Write-Host "Updating all packages"
|
||||
& $updateCmd
|
||||
}
|
||||
|
||||
"upgrade" {
|
||||
Write-Host "Upgrading all packages"
|
||||
& $updateCmd
|
||||
}
|
||||
|
||||
"clean" {
|
||||
Write-Host "Cleaning package cache"
|
||||
& $cleanCmd
|
||||
|
||||
# Clean Windows temp
|
||||
Remove-Item -Path 'C:\Windows\Temp\*' -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item -Path "C:\Users\$env:USERNAME\AppData\Local\Temp\*" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
"version" {
|
||||
if ($pkgMgr -eq "winget") {
|
||||
& winget --version
|
||||
} elseif ($pkgMgr -eq "chocolatey") {
|
||||
& choco --version
|
||||
}
|
||||
}
|
||||
|
||||
default {
|
||||
Write-Host "pkmgr - Package Manager Wrapper for Windows Containers"
|
||||
Write-Host ""
|
||||
Write-Host "Usage: pkmgr <action> [packages...]"
|
||||
Write-Host ""
|
||||
Write-Host "Actions:"
|
||||
Write-Host " install <pkg> - Install package(s)"
|
||||
Write-Host " update - Update all packages"
|
||||
Write-Host " upgrade - Upgrade all packages"
|
||||
Write-Host " clean - Clean package cache"
|
||||
Write-Host " version - Show package manager version"
|
||||
Write-Host ""
|
||||
Write-Host "Current package manager: $pkgMgr"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user