Deploying FrameworX in Docker and Kubernetes environments.

Parent Page: Deployment (Reference)



Docker Deployment

Base Image Creation

Dockerfile:

dockerfile

FROM mcr.microsoft.com/dotnet/runtime:8.0

# Install dependencies
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libssl-dev \
    && rm -rf /var/lib/apt/lists/*

# Copy runtime files
COPY ./net8.0 /app
WORKDIR /app

# Set permissions
RUN chmod +x TServer.exe TWebServices.exe

# Expose ports
EXPOSE 10108

# Set entry point
ENTRYPOINT ["./TServer.exe"]
CMD ["/solution:MySolution.tproj"]

Build and Run

bash

# Build image
docker build -t frameworkx:10.1 .

# Run container
docker run -d \
  --name frameworkx-runtime \
  -p 10108:10108 \
  -v /host/solutions:/app/solutions \
  -v /host/data:/app/data \
  frameworkx:10.1

Docker Compose

Multi-Container Setup

docker-compose.yml:

yaml

version: '3.8'

services:
  frameworkx:
    image: frameworkx:10.1
    ports:
      - "10108:10108"
    environment:
      - LICENSE_KEY=${LICENSE_KEY}
      - DB_CONNECTION=Server=database;Database=fx
    volumes:
      - solutions:/app/solutions
      - data:/app/data
    depends_on:
      - database
    restart: unless-stopped

  database:
    image: mcr.microsoft.com/mssql/server:2019-latest
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=${DB_PASSWORD}
    volumes:
      - dbdata:/var/opt/mssql
    ports:
      - "1433:1433"

volumes:
  solutions:
  data:
  dbdata:

Kubernetes Deployment

Deployment Manifest

frameworkx-deployment.yaml:

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frameworkx-runtime
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frameworkx
  template:
    metadata:
      labels:
        app: frameworkx
    spec:
      containers:
      - name: frameworkx
        image: frameworkx:10.1
        ports:
        - containerPort: 10108
        env:
        - name: LICENSE_KEY
          valueFrom:
            secretKeyRef:
              name: frameworkx-secrets
              key: license-key
        volumeMounts:
        - name: solutions
          mountPath: /app/solutions
        - name: data
          mountPath: /app/data
      volumes:
      - name: solutions
        persistentVolumeClaim:
          claimName: solutions-pvc
      - name: data
        persistentVolumeClaim:
          claimName: data-pvc

Service Configuration

frameworkx-service.yaml:

yaml

apiVersion: v1
kind: Service
metadata:
  name: frameworkx-service
spec:
  selector:
    app: frameworkx
  ports:
    - protocol: TCP
      port: 10108
      targetPort: 10108
  type: LoadBalancer

Persistent Storage

Docker Volumes

bash

# Create named volumes
docker volume create frameworkx-solutions
docker volume create frameworkx-data

# Backup volumes
docker run --rm \
  -v frameworkx-solutions:/source \
  -v /backup:/backup \
  alpine tar czf /backup/solutions.tar.gz -C /source .

Kubernetes PVC

yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: solutions-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Container Configuration

Environment Variables

VariableDescriptionExample
LICENSE_KEYProduct licenseXXXX-XXXX-XXXX
DB_CONNECTIONDatabase stringServer=db;Database=fx
LOG_LEVELLogging levelInformation
TZTimezoneAmerica/New_York

Health Checks

dockerfile

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:10108/health || exit 1

Orchestration

Auto-Scaling

yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: frameworkx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: frameworkx-runtime
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

Rolling Updates

yaml

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0


  • No labels