Build Container Image with OC CLI

  ______     ______      ______  __       __  
 /  __  \   /      |    /      ||  |     |  | 
|  |  |  | |  ,----'   |  ,----'|  |     |  | 
|  |  |  | |  |        |  |     |  |     |  | 
|  `--'  | |  `----.   |  `----.|  `----.|  | 
 \______/   \______|    \______||_______||__|

Configure OpenShift with external registry (optional)

  • Create docker secret to access external registry

    • With user and password
    NEXUS_REGISTRY=external_registry.example.com
    oc create secret docker-registry nexus-registry --docker-server=$NEXUS_REGISTRY \
    --docker-username=$CICD_NEXUS_USER \
    --docker-password=$CICD_NEXUS_PASSWORD \
    --docker-email=unused \
    
    • From dockercfg file
    apiVersion: v1
    kind: Secret
    metadata:
      name: nexus-registry
    type: kubernetes.io/dockercfg
    data:
      .dockercfg: |
            "<base64 encoded ~/.dockercfg file>"
    
  • Link secret for builder

    oc secrets link default nexus-registry --for=pull
    
  • Link secret for pull image

    oc secrets link builder nexus-registry
    
  • For insecure registry

    • Edit image.config.openshift.io/cluster
     oc edit image.config.openshift.io/cluster
    
    • Add insecure registry to spec
    spec:
      registrySources:
        insecureRegistries:
        - nexus-registry.ci-cd.svc.cluster.local
        - nexus-registry.example.com
    

Source build

All-in-One

  • Use source-to-image from git this will create

    • image stream
    • build config
    • deployment
    • service
    oc new-app https://gitlab.com/ocp-demo/frontend-js \
    --name=frontend
    
    • Check build log
    oc logs bc/frontend --follow
    

Build and Deploy

  • Create build config

    oc new-build --name=frontend-v1 -l app=frontend-v1 \
    https://gitlab.com/ocp-demo/frontend-js
    
  • Create deployment and service

    oc new-app frontend-v1
    

Binary build with Dockerfile

  • Clone sample Backend Quarkus

    git clone https://gitlab.com/ocp-demo/backend_quarkus
    
  • Create application binary

    cd code
    mvn clean package -DskipTests=true
    
  • Create Build Config

    • Push to OpenShift's internal image registry

      APP_NAME=backend
      oc new-build --binary --name=$APP_NAME -l app=$APP_NAME
      
    • Push to OpenShift's external image registry

      APP_NAME=backend
      EXTERNAL_REGISTRY=nexus-registry.example.com
      EXTERNAL_REGISTRY_SECRET=nexus-registry
      TAG=latest
      oc new-build --binary --to-docker=true \
      --to=$EXTERNAL_REGISTRY/$APP_NAME:$TAG \
      --push-secret=$EXTERNAL_REGISTRY_SECRET \
      --name=$APP_NAME \
      -l app=$APP_NAME
      
  • Change build strategy to DockerStrategy

    oc patch bc/$APP_NAME \
    -p "{\"spec\":{\"strategy\":{\"dockerStrategy\":{\"dockerfilePath\":\"src/main/docker/Dockerfile.jvm\"}}}}"
    
  • Build container image

    oc start-build $APP_NAME --from-dir=. --follow
    
  • Create Application

    • from internal image registry

      oc new-app --image-stream=${APP_NAME} \
      --labels=app.openshift.io/runtime=quarkus,app.openshift.io/runtime-version=11,app.kubernetes.io/part-of=Demo
      
  • Pause rollout deployment

    oc expose svc $APP_NAME
    
  • Create liveness and readiness probe

    oc set probe deployment/$APP_NAME --readiness \
    --get-url=http://:8080/q/health/ready \
    --initial-delay-seconds=8 \
    --failure-threshold=1 --period-seconds=10
    oc set probe deployment/$APP_NAME --liveness \
    --get-url=http://:8080/q/health/live \
    --initial-delay-seconds=5 -\
    -failure-threshold=3 --period-seconds=10
    
  • Set request and limit

    oc set resources deployment $APP_NAME  --requests="cpu=50m,memory=100Mi"
    oc set resources deployment $APP_NAME  --limits="cpu=150m,memory=150Mi"
    
  • Create configmap

    oc create configmap $APP_NAME --from-file=config/application.properties
    oc set volume deployment/{APP_NAME --add --name=$APP_NAME-config \
    --mount-path=/deployments/config/application.properties \
    --sub-path=application.properties \
    --configmap-name=$APP_NAME
    
  • Set HPA

    oc autoscale deployment $APP_NAME --min 2 --max 4 --cpu-percent=60
    
  • Resume rollout deployment

    oc rollout resume deployment $APP_NAME
    
  • Create route

    • Expose service

      oc expose svc $APP_NAME
      
    • Create route with edge TLS

      oc create route edge $APP_NAME --service=$APP_NAME --port=8080
      

results matching ""

    No results matching ""