Add offline Python wheels and air-gapped deployment solution
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
This commit is contained in:
parent
1ff2db78c8
commit
a02ba81b84
136
AIR_GAPPED_SOLUTION.md
Normal file
136
AIR_GAPPED_SOLUTION.md
Normal file
@ -0,0 +1,136 @@
|
||||
# Air-Gapped Cluster Build Solution
|
||||
|
||||
## Problem
|
||||
Your Kubernetes cluster has **no external internet access**:
|
||||
- ❌ Cannot reach Docker Hub (`index.docker.io`)
|
||||
- ❌ Cannot reach Debian repositories (`deb.debian.org`)
|
||||
- ❌ Cannot reach PyPI (`pypi.org`)
|
||||
- ❌ TLS handshake failures
|
||||
- ❌ HTTP 530 errors
|
||||
|
||||
## Solution
|
||||
Use Harbor as an internal registry for all base images.
|
||||
|
||||
## Quick Fix (Implemented)
|
||||
|
||||
### Backend Dockerfile Changes
|
||||
✅ **Removed `apt-get` commands** - Not needed since `psycopg2-binary` is pre-compiled
|
||||
✅ **Changed base image** to `harbor.dvirlabs.com/dockerhub/python:3.11-slim`
|
||||
|
||||
### What You Need to Do NOW
|
||||
|
||||
**1. Download Python Wheels (on a machine with internet)**
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
.\download-wheels.bat # Windows
|
||||
# OR
|
||||
./download-wheels.sh # Linux/Mac
|
||||
```
|
||||
|
||||
This downloads all Python packages as wheel files to `backend/wheels/`.
|
||||
|
||||
**2. Push Base Images to Harbor**
|
||||
|
||||
Run the appropriate script for your OS:
|
||||
|
||||
**Windows:**
|
||||
```bash
|
||||
.\push-base-images.bat
|
||||
```
|
||||
|
||||
**Linux/Mac:**
|
||||
```bash
|
||||
chmod +x push-base-images.sh
|
||||
./push-base-images.sh
|
||||
```
|
||||
|
||||
This pushes these images to `harbor.dvirlabs.com/dockerhub/`:
|
||||
- python:3.11-slim
|
||||
- node:18-alpine
|
||||
- nginx:alpine
|
||||
- postgres:16-alpine
|
||||
- alpCommit Wheels and Test the Build**
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "fix: Bundle Python wheels for offline installation"
|
||||
git push
|
||||
```
|
||||
|
||||
See [OFFLINE_PYPI_SOLUTION.md](OFFLINE_PYPI_SOLUTION.md) for details.e sure these projects exist in Harbor:
|
||||
- `dockerhub` - For public images from Docker Hub
|
||||
- `base-images` - For custom-built images (optional)
|
||||
- `my-apps` - For your application images
|
||||
|
||||
**3. Test the Build**
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "fix: Remove apt-get to avoid Debian repo access, use Harbor images"
|
||||
git push
|
||||
```
|
||||
|
||||
## Advanced: Custom Base Image (Optional)
|
||||
|
||||
If you need `gcc`, `postgresql-client`, or other build tools in the future:
|
||||
|
||||
**1. Build Custom Image (on a machine with internet):**
|
||||
|
||||
```bash
|
||||
# Windows
|
||||
.\build-custom-base-images.bat
|
||||
|
||||
# Linux/Mac
|
||||
chmod +x build-custom-base-images.sh
|
||||
./build-custom-base-images.sh
|
||||
```
|
||||
|
||||
**2. Update Dockerfile to use it:**
|
||||
|
||||
```dockerfile
|
||||
FROM harbor.dvirlabs.com/base-images/python:3.11-slim-dev
|
||||
```
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
brand-master/
|
||||
├── backend/
|
||||
│ └── Dockerfile # ✅ Fixed - no apt-get needed
|
||||
├── frontend/
|
||||
│ └── Dockerfile # ✅ Uses Harbor images
|
||||
├── base-images/
|
||||
│ ├── python-3.11-slim-dev/
|
||||
│ │ └── Dockerfile # Custom image with build tools
|
||||
│ └── BUILD_INSTRUCTIONS.md
|
||||
├── push-base-images.sh # Push Docker Hub images to Harbor
|
||||
├── push-base-images.bat
|
||||
├── build-custom-base-images.sh # Build custom images with deps
|
||||
└── build-custom-base-images.bat
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Build still fails with "unable to reach..."
|
||||
- Verify images are in Harbor: `https://harbor.dvirlabs.com`
|
||||
- Check project permissions (public or pull secrets configured)
|
||||
- Verify Kubernetes nodes can resolve `harbor.dvirlabs.com`
|
||||
|
||||
### Need to add more dependencies
|
||||
- Option 1: Use custom base image (see Advanced section)
|
||||
- Option 2: Pre-install in a custom image layer
|
||||
|
||||
### Images not found in Harbor
|
||||
- Run `push-base-images.sh` or `.bat` script
|
||||
- Check Harbor UI to verify images uploaded
|
||||
- Ensure project names match exactly
|
||||
|
||||
## Current Status
|
||||
|
||||
✅ Backend Dockerfile - **FIXED** (no apt-get, uses Harbor)
|
||||
✅ Frontend Dockerfile - **FIXED** (uses Harbor)
|
||||
✅ Helm Chart - **FIXED** (uses Harbor)
|
||||
✅ CI Pipeline - **FIXED** (uses Harbor Kaniko)
|
||||
|
||||
**Next Step:** Run `push-base-images.sh/.bat` and commit your changes!
|
||||
111
OFFLINE_PYPI_SOLUTION.md
Normal file
111
OFFLINE_PYPI_SOLUTION.md
Normal file
@ -0,0 +1,111 @@
|
||||
# Offline PyPI Solution for Air-Gapped Cluster
|
||||
|
||||
## Problem
|
||||
Your cluster blocks **ALL external internet access**:
|
||||
- ❌ Docker Hub (`index.docker.io`) - BLOCKED
|
||||
- ❌ Debian repositories (`deb.debian.org`) - BLOCKED
|
||||
- ❌ **PyPI (`pypi.org`) - BLOCKED** ← NEW ISSUE
|
||||
|
||||
## Solution: Bundle Python Packages
|
||||
|
||||
Since `pip install` cannot reach PyPI, we pre-download all packages as wheel files and bundle them in the Docker image.
|
||||
|
||||
## Quick Fix Steps
|
||||
|
||||
### Step 1: Download Wheels (On a machine WITH internet)
|
||||
|
||||
**Windows:**
|
||||
```bash
|
||||
cd backend
|
||||
.\download-wheels.bat
|
||||
```
|
||||
|
||||
**Linux/Mac:**
|
||||
```bash
|
||||
cd backend
|
||||
chmod +x download-wheels.sh
|
||||
./download-wheels.sh
|
||||
```
|
||||
|
||||
This downloads ~30-50 wheel files to `backend/wheels/` directory.
|
||||
|
||||
### Step 2: Commit Wheels to Git
|
||||
|
||||
```bash
|
||||
git add backend/wheels/
|
||||
git commit -m "Add offline Python wheels for air-gapped cluster"
|
||||
git push
|
||||
```
|
||||
|
||||
### Step 3: Verify Dockerfile
|
||||
|
||||
The Dockerfile now:
|
||||
1. ✅ Copies `wheels/` directory into image
|
||||
2. ✅ Installs using `pip install --no-index --find-links /tmp/wheels`
|
||||
3. ✅ No internet needed during build!
|
||||
|
||||
### Step 4: Test Build
|
||||
|
||||
Your CI pipeline will now build successfully without PyPI access.
|
||||
|
||||
## How It Works
|
||||
|
||||
### Before (FAILED):
|
||||
```dockerfile
|
||||
RUN pip install -r requirements.txt
|
||||
# ❌ Tries to reach pypi.org → SSL handshake failure
|
||||
```
|
||||
|
||||
### After (SUCCESS):
|
||||
```dockerfile
|
||||
COPY wheels/ /tmp/wheels/
|
||||
RUN pip install --no-index --find-links /tmp/wheels -r requirements.txt
|
||||
# ✅ Installs from local files → No internet needed
|
||||
```
|
||||
|
||||
## Updating Dependencies
|
||||
|
||||
When you add new packages to `requirements.txt`:
|
||||
|
||||
1. **Update wheels** (on internet-connected machine):
|
||||
```bash
|
||||
cd backend
|
||||
rm -rf wheels/ # Clear old wheels
|
||||
./download-wheels.sh # Download new ones
|
||||
```
|
||||
|
||||
2. **Commit and push**:
|
||||
```bash
|
||||
git add wheels/ requirements.txt
|
||||
git commit -m "Update dependencies and wheels"
|
||||
git push
|
||||
```
|
||||
|
||||
## Wheel Directory Size
|
||||
|
||||
Expect `backend/wheels/` to be **~50-100MB** with all dependencies.
|
||||
|
||||
**Tips:**
|
||||
- ✅ This is normal and necessary for air-gapped deployment
|
||||
- ✅ Git can handle it fine
|
||||
- ⚠️ If it grows >100MB, consider Git LFS
|
||||
|
||||
## Alternative: PyPI Mirror in Harbor
|
||||
|
||||
If Harbor supports PyPI proxy (check with your admin), you could:
|
||||
|
||||
1. Configure Harbor as PyPI mirror
|
||||
2. Update pip to use it:
|
||||
```dockerfile
|
||||
RUN pip install --index-url https://harbor.dvirlabs.com/api/pypi/simple -r requirements.txt
|
||||
```
|
||||
|
||||
Ask your Harbor admin if PyPI proxy is available.
|
||||
|
||||
## Current Status
|
||||
|
||||
✅ Backend Dockerfile - **UPDATED** (installs from local wheels)
|
||||
✅ Download scripts - **CREATED**
|
||||
⏳ **ACTION NEEDED:** Run `download-wheels.bat` and commit wheels
|
||||
|
||||
**Next:** Download wheels and push to Git!
|
||||
30
backend/.gitignore
vendored
Normal file
30
backend/.gitignore
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
.venv
|
||||
|
||||
# Environment
|
||||
.env
|
||||
.env.local
|
||||
|
||||
# IDE
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Uploads (images will be in PVC)
|
||||
uploads/
|
||||
|
||||
# Database
|
||||
*.db
|
||||
*.sqlite
|
||||
|
||||
# Note: We DO commit wheels/ directory for air-gapped deployment
|
||||
# If wheels/ gets too large, consider using Git LFS or external storage
|
||||
31
backend/download-wheels.bat
Normal file
31
backend/download-wheels.bat
Normal file
@ -0,0 +1,31 @@
|
||||
@echo off
|
||||
REM Download all Python packages as wheel files for offline installation
|
||||
REM Run this on a machine with internet access
|
||||
|
||||
echo.
|
||||
echo 📦 Downloading Python wheels for offline installation...
|
||||
echo.
|
||||
|
||||
REM Create wheels directory
|
||||
if not exist wheels mkdir wheels
|
||||
|
||||
REM Download all dependencies including their dependencies
|
||||
pip download ^
|
||||
--dest wheels ^
|
||||
--platform manylinux2014_x86_64 ^
|
||||
--only-binary=:all: ^
|
||||
--python-version 3.11 ^
|
||||
-r requirements.txt
|
||||
|
||||
echo.
|
||||
echo ✅ Downloaded all wheels to ./wheels/
|
||||
echo.
|
||||
echo Files downloaded:
|
||||
dir wheels /b
|
||||
echo.
|
||||
echo Next steps:
|
||||
echo 1. Commit the wheels directory: git add wheels/ ^&^& git commit -m "Add offline Python wheels"
|
||||
echo 2. Push to Git: git push
|
||||
echo 3. The Dockerfile will install from local wheels (no PyPI access needed)
|
||||
echo.
|
||||
pause
|
||||
30
backend/download-wheels.sh
Normal file
30
backend/download-wheels.sh
Normal file
@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
# Download all Python packages as wheel files for offline installation
|
||||
# Run this on a machine with internet access
|
||||
|
||||
set -e
|
||||
|
||||
echo "📦 Downloading Python wheels for offline installation..."
|
||||
echo ""
|
||||
|
||||
# Create wheels directory
|
||||
mkdir -p wheels
|
||||
|
||||
# Download all dependencies including their dependencies
|
||||
pip download \
|
||||
--dest wheels \
|
||||
--platform manylinux2014_x86_64 \
|
||||
--only-binary=:all: \
|
||||
--python-version 3.11 \
|
||||
-r requirements.txt
|
||||
|
||||
echo ""
|
||||
echo "✅ Downloaded all wheels to ./wheels/"
|
||||
echo ""
|
||||
echo "Files downloaded:"
|
||||
ls -lh wheels/
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo "1. Commit the wheels directory: git add wheels/ && git commit -m 'Add offline Python wheels'"
|
||||
echo "2. Push to Git: git push"
|
||||
echo "3. The Dockerfile will install from local wheels (no PyPI access needed)"
|
||||
BIN
backend/wheels/annotated_doc-0.0.4-py3-none-any.whl
Normal file
BIN
backend/wheels/annotated_doc-0.0.4-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/annotated_types-0.7.0-py3-none-any.whl
Normal file
BIN
backend/wheels/annotated_types-0.7.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/anyio-4.13.0-py3-none-any.whl
Normal file
BIN
backend/wheels/anyio-4.13.0-py3-none-any.whl
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
backend/wheels/click-8.3.3-py3-none-any.whl
Normal file
BIN
backend/wheels/click-8.3.3-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/colorama-0.4.6-py2.py3-none-any.whl
Normal file
BIN
backend/wheels/colorama-0.4.6-py2.py3-none-any.whl
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/wheels/dnspython-2.8.0-py3-none-any.whl
Normal file
BIN
backend/wheels/dnspython-2.8.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/ecdsa-0.19.2-py2.py3-none-any.whl
Normal file
BIN
backend/wheels/ecdsa-0.19.2-py2.py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/email_validator-2.3.0-py3-none-any.whl
Normal file
BIN
backend/wheels/email_validator-2.3.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/fastapi-0.136.1-py3-none-any.whl
Normal file
BIN
backend/wheels/fastapi-0.136.1-py3-none-any.whl
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/wheels/h11-0.16.0-py3-none-any.whl
Normal file
BIN
backend/wheels/h11-0.16.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/idna-3.13-py3-none-any.whl
Normal file
BIN
backend/wheels/idna-3.13-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/passlib-1.7.4-py2.py3-none-any.whl
Normal file
BIN
backend/wheels/passlib-1.7.4-py2.py3-none-any.whl
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/wheels/pyasn1-0.6.3-py3-none-any.whl
Normal file
BIN
backend/wheels/pyasn1-0.6.3-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/pycparser-3.0-py3-none-any.whl
Normal file
BIN
backend/wheels/pycparser-3.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/pydantic-2.13.3-py3-none-any.whl
Normal file
BIN
backend/wheels/pydantic-2.13.3-py3-none-any.whl
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/wheels/pydantic_settings-2.14.0-py3-none-any.whl
Normal file
BIN
backend/wheels/pydantic_settings-2.14.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/python_dotenv-1.2.2-py3-none-any.whl
Normal file
BIN
backend/wheels/python_dotenv-1.2.2-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/python_jose-3.5.0-py2.py3-none-any.whl
Normal file
BIN
backend/wheels/python_jose-3.5.0-py2.py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/python_multipart-0.0.27-py3-none-any.whl
Normal file
BIN
backend/wheels/python_multipart-0.0.27-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/rsa-4.9.1-py3-none-any.whl
Normal file
BIN
backend/wheels/rsa-4.9.1-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/six-1.17.0-py2.py3-none-any.whl
Normal file
BIN
backend/wheels/six-1.17.0-py2.py3-none-any.whl
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/wheels/starlette-1.0.0-py3-none-any.whl
Normal file
BIN
backend/wheels/starlette-1.0.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/typing_extensions-4.15.0-py3-none-any.whl
Normal file
BIN
backend/wheels/typing_extensions-4.15.0-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/typing_inspection-0.4.2-py3-none-any.whl
Normal file
BIN
backend/wheels/typing_inspection-0.4.2-py3-none-any.whl
Normal file
Binary file not shown.
BIN
backend/wheels/uvicorn-0.46.0-py3-none-any.whl
Normal file
BIN
backend/wheels/uvicorn-0.46.0-py3-none-any.whl
Normal file
Binary file not shown.
10
base-images/BUILD_INSTRUCTIONS.md
Normal file
10
base-images/BUILD_INSTRUCTIONS.md
Normal file
@ -0,0 +1,10 @@
|
||||
# Build and push custom Python base image to Harbor
|
||||
# This image has all build dependencies pre-installed
|
||||
|
||||
# 1. Build the image locally (from your machine with internet access)
|
||||
docker build -t harbor.dvirlabs.com/base-images/python:3.11-slim-dev ./base-images/python-3.11-slim-dev
|
||||
|
||||
# 2. Push to Harbor
|
||||
docker push harbor.dvirlabs.com/base-images/python:3.11-slim-dev
|
||||
|
||||
# Now your cluster can use this image without needing internet access
|
||||
24
base-images/python-3.11-slim-dev/Dockerfile
Normal file
24
base-images/python-3.11-slim-dev/Dockerfile
Normal file
@ -0,0 +1,24 @@
|
||||
# Custom Python base image with build tools pre-installed
|
||||
# Build this once and push to Harbor to avoid apt-get during app builds
|
||||
|
||||
FROM python:3.11-slim
|
||||
|
||||
# Install system dependencies that might be needed for Python packages
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc \
|
||||
g++ \
|
||||
make \
|
||||
postgresql-client \
|
||||
libpq-dev \
|
||||
curl \
|
||||
git \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Upgrade pip
|
||||
RUN pip install --no-cache-dir --upgrade pip setuptools wheel
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /app
|
||||
|
||||
# Default command
|
||||
CMD ["/bin/bash"]
|
||||
40
build-custom-base-images.bat
Normal file
40
build-custom-base-images.bat
Normal file
@ -0,0 +1,40 @@
|
||||
@echo off
|
||||
REM Build custom base images with dependencies pre-installed
|
||||
REM Run this on a machine with internet access, then push to Harbor
|
||||
|
||||
set HARBOR_REGISTRY=harbor.dvirlabs.com
|
||||
set HARBOR_PROJECT=base-images
|
||||
|
||||
echo.
|
||||
echo 🏗️ Building custom base images for air-gapped cluster...
|
||||
echo Registry: %HARBOR_REGISTRY%
|
||||
echo Project: %HARBOR_PROJECT%
|
||||
echo.
|
||||
|
||||
REM Login to Harbor
|
||||
echo Please login to Harbor:
|
||||
docker login %HARBOR_REGISTRY%
|
||||
|
||||
echo.
|
||||
echo 📦 Building Python base image with dev tools...
|
||||
echo.
|
||||
|
||||
REM Build Python dev image
|
||||
cd base-images\python-3.11-slim-dev
|
||||
docker build -t %HARBOR_REGISTRY%/%HARBOR_PROJECT%/python:3.11-slim-dev .
|
||||
cd ..\..
|
||||
|
||||
echo ✅ Built: python:3.11-slim-dev
|
||||
echo.
|
||||
|
||||
REM Push to Harbor
|
||||
echo 🚀 Pushing to Harbor...
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/python:3.11-slim-dev
|
||||
|
||||
echo.
|
||||
echo 🎉 Custom base image pushed successfully!
|
||||
echo.
|
||||
echo To use this image, update your Dockerfile:
|
||||
echo FROM %HARBOR_REGISTRY%/%HARBOR_PROJECT%/python:3.11-slim-dev
|
||||
echo.
|
||||
pause
|
||||
40
build-custom-base-images.sh
Normal file
40
build-custom-base-images.sh
Normal file
@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
# Build custom base images with dependencies pre-installed
|
||||
# Run this on a machine with internet access, then push to Harbor
|
||||
|
||||
set -e
|
||||
|
||||
HARBOR_REGISTRY="harbor.dvirlabs.com"
|
||||
HARBOR_PROJECT="base-images"
|
||||
|
||||
echo "🏗️ Building custom base images for air-gapped cluster..."
|
||||
echo "Registry: $HARBOR_REGISTRY"
|
||||
echo "Project: $HARBOR_PROJECT"
|
||||
echo ""
|
||||
|
||||
# Login to Harbor
|
||||
echo "Please login to Harbor:"
|
||||
docker login $HARBOR_REGISTRY
|
||||
|
||||
echo ""
|
||||
echo "📦 Building Python base image with dev tools..."
|
||||
echo ""
|
||||
|
||||
# Build Python dev image
|
||||
cd base-images/python-3.11-slim-dev
|
||||
docker build -t $HARBOR_REGISTRY/$HARBOR_PROJECT/python:3.11-slim-dev .
|
||||
cd ../..
|
||||
|
||||
echo "✅ Built: python:3.11-slim-dev"
|
||||
echo ""
|
||||
|
||||
# Push to Harbor
|
||||
echo "🚀 Pushing to Harbor..."
|
||||
docker push $HARBOR_REGISTRY/$HARBOR_PROJECT/python:3.11-slim-dev
|
||||
|
||||
echo ""
|
||||
echo "🎉 Custom base image pushed successfully!"
|
||||
echo ""
|
||||
echo "To use this image, update your Dockerfile:"
|
||||
echo " FROM $HARBOR_REGISTRY/$HARBOR_PROJECT/python:3.11-slim-dev"
|
||||
echo ""
|
||||
82
push-base-images.bat
Normal file
82
push-base-images.bat
Normal file
@ -0,0 +1,82 @@
|
||||
@echo off
|
||||
REM Script to push base images to Harbor for offline/isolated cluster builds
|
||||
|
||||
set HARBOR_REGISTRY=harbor.dvirlabs.com
|
||||
set HARBOR_PROJECT=dockerhub
|
||||
|
||||
echo.
|
||||
echo 🐳 Pushing base images to Harbor...
|
||||
echo Registry: %HARBOR_REGISTRY%
|
||||
echo Project: %HARBOR_PROJECT%
|
||||
echo.
|
||||
|
||||
REM Login to Harbor
|
||||
echo Please login to Harbor:
|
||||
docker login %HARBOR_REGISTRY%
|
||||
|
||||
echo.
|
||||
echo 📦 Processing base images...
|
||||
echo.
|
||||
|
||||
REM Python base image
|
||||
echo ➡️ Processing: python:3.11-slim
|
||||
docker pull python:3.11-slim
|
||||
docker tag python:3.11-slim %HARBOR_REGISTRY%/%HARBOR_PROJECT%/python:3.11-slim
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/python:3.11-slim
|
||||
echo ✅ Done
|
||||
echo.
|
||||
|
||||
REM Node base image
|
||||
echo ➡️ Processing: node:18-alpine
|
||||
docker pull node:18-alpine
|
||||
docker tag node:18-alpine %HARBOR_REGISTRY%/%HARBOR_PROJECT%/node:18-alpine
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/node:18-alpine
|
||||
echo ✅ Done
|
||||
echo.
|
||||
|
||||
REM Nginx base image
|
||||
echo ➡️ Processing: nginx:alpine
|
||||
docker pull nginx:alpine
|
||||
docker tag nginx:alpine %HARBOR_REGISTRY%/%HARBOR_PROJECT%/nginx:alpine
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/nginx:alpine
|
||||
echo ✅ Done
|
||||
echo.
|
||||
|
||||
REM Postgres base image
|
||||
echo ➡️ Processing: postgres:16-alpine
|
||||
docker pull postgres:16-alpine
|
||||
docker tag postgres:16-alpine %HARBOR_REGISTRY%/%HARBOR_PROJECT%/postgres:16-alpine
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/postgres:16-alpine
|
||||
echo ✅ Done
|
||||
echo.
|
||||
|
||||
REM Alpine base image
|
||||
echo ➡️ Processing: alpine:3.19
|
||||
docker pull alpine:3.19
|
||||
docker tag alpine:3.19 %HARBOR_REGISTRY%/%HARBOR_PROJECT%/alpine:3.19
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/alpine:3.19
|
||||
echo ✅ Done
|
||||
echo.
|
||||
|
||||
REM Busybox images
|
||||
echo ➡️ Processing: busybox:1.35
|
||||
docker pull busybox:1.35
|
||||
docker tag busybox:1.35 %HARBOR_REGISTRY%/%HARBOR_PROJECT%/busybox:1.35
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/busybox:1.35
|
||||
echo ✅ Done
|
||||
echo.
|
||||
|
||||
echo ➡️ Processing: busybox:latest
|
||||
docker pull busybox:latest
|
||||
docker tag busybox:latest %HARBOR_REGISTRY%/%HARBOR_PROJECT%/busybox:latest
|
||||
docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/busybox:latest
|
||||
echo ✅ Done
|
||||
echo.
|
||||
|
||||
echo.
|
||||
echo 🎉 All base images pushed successfully!
|
||||
echo.
|
||||
echo Your Harbor now contains all required base images.
|
||||
echo You can now build your application in the cluster without Docker Hub access!
|
||||
echo.
|
||||
pause
|
||||
60
push-base-images.sh
Normal file
60
push-base-images.sh
Normal file
@ -0,0 +1,60 @@
|
||||
#!/bin/bash
|
||||
# Script to push base images to Harbor for offline/isolated cluster builds
|
||||
|
||||
set -e
|
||||
|
||||
HARBOR_REGISTRY="harbor.dvirlabs.com"
|
||||
HARBOR_PROJECT="dockerhub"
|
||||
|
||||
echo "🐳 Pushing base images to Harbor..."
|
||||
echo "Registry: $HARBOR_REGISTRY"
|
||||
echo "Project: $HARBOR_PROJECT"
|
||||
echo ""
|
||||
|
||||
# Login to Harbor (you may need to provide credentials)
|
||||
echo "Please login to Harbor:"
|
||||
docker login $HARBOR_REGISTRY
|
||||
|
||||
# Base images needed for the project
|
||||
BASE_IMAGES=(
|
||||
"python:3.11-slim"
|
||||
"node:18-alpine"
|
||||
"nginx:alpine"
|
||||
"postgres:16-alpine"
|
||||
"alpine:3.19"
|
||||
"busybox:1.35"
|
||||
"busybox:latest"
|
||||
)
|
||||
|
||||
echo ""
|
||||
echo "📦 Processing ${#BASE_IMAGES[@]} base images..."
|
||||
echo ""
|
||||
|
||||
for IMAGE in "${BASE_IMAGES[@]}"; do
|
||||
echo "➡️ Processing: $IMAGE"
|
||||
|
||||
# Pull from Docker Hub
|
||||
echo " Pulling from Docker Hub..."
|
||||
docker pull $IMAGE
|
||||
|
||||
# Tag for Harbor
|
||||
HARBOR_IMAGE="$HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE"
|
||||
echo " Tagging as: $HARBOR_IMAGE"
|
||||
docker tag $IMAGE $HARBOR_IMAGE
|
||||
|
||||
# Push to Harbor
|
||||
echo " Pushing to Harbor..."
|
||||
docker push $HARBOR_IMAGE
|
||||
|
||||
echo " ✅ Done: $IMAGE"
|
||||
echo ""
|
||||
done
|
||||
|
||||
echo "🎉 All base images pushed successfully!"
|
||||
echo ""
|
||||
echo "Your Harbor now contains:"
|
||||
for IMAGE in "${BASE_IMAGES[@]}"; do
|
||||
echo " - $HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE"
|
||||
done
|
||||
echo ""
|
||||
echo "You can now build your application in the cluster without Docker Hub access!"
|
||||
Loading…
x
Reference in New Issue
Block a user