惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
爱范儿
爱范儿
V
Visual Studio Blog
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 三生石上(FineUI控件)
博客园 - Franky
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
罗磊的独立博客
L
LangChain Blog
Jina AI
Jina AI
IT之家
IT之家
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
docker init OCIR OKE: From Empty Folder to Production in ...
Pavan Madduri · 2026-06-24 · via DEV Community
Cover image for docker init OCIR OKE: From Empty Folder to Production in 15 Minutes

Pavan Madduri

I timed myself. Starting from an empty directory with a Go application idea, how fast could I get to a running deployment on OKE? The answer was 14 minutes. docker init did more of the work than I expected.

What docker init Does

If you haven't used it, docker init is an interactive scaffolding tool built into Docker CLI. You run it in your project directory and it generates a Dockerfile, .dockerignore, and docker-compose.yml tuned for your language.

mkdir oci-api && cd oci-api
go mod init github.com/pmady/oci-api

# Write a quick API
cat > main.go << 'EOF'
package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "running on %s", os.Getenv("OCI_REGION"))
    })
    http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(200)
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}
EOF

Now the magic part:

$ docker init

Welcome to the Docker Init CLI!

? What application platform does your project use? Go
? What version of Go do you want to use? 1.22
? What's the relative directory for your main package? .
? What port does your server listen on? 8080

It generates three files:

Dockerfile — Multi-stage build, distroless base, non-root user. Actually good defaults. I've seen teams write worse Dockerfiles by hand.

compose.yaml — Basic setup with port mapping and env vars.

.dockerignore — Excludes .git, binaries, vendor directory. Reasonable.

The generated Dockerfile looked like this (slightly simplified):

FROM golang:1.22 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /bin/server .

FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /bin/server /bin/
EXPOSE 8080
USER nonroot:nonroot
ENTRYPOINT ["/bin/server"]

Multi-stage, static binary, distroless, non-root. I'd write almost the same thing myself. The only change I made was adding -ldflags="-s -w" to strip debug symbols and shrink the binary.

Minute 0-5: Build and Test Locally

docker compose up --build

# In another terminal
curl localhost:8080
# running on

curl localhost:8080/health
# 200 OK

Works. Five minutes in and I have a containerized API running locally.

Minute 5-8: Push to OCIR

# Login
docker login iad.ocir.io -u '<tenancy-namespace>/pmady'

# Tag
docker tag oci-api-server:latest iad.ocir.io/<tenancy>/demos/oci-api:v1

# Quick scan
docker scout cves iad.ocir.io/<tenancy>/demos/oci-api:v1

# Push
docker push iad.ocir.io/<tenancy>/demos/oci-api:v1

Scout showed zero CVEs because distroless has almost nothing in it. Push took about 10 seconds because the image is 12MB.

Minute 8-14: Deploy to OKE

I already had an OKE cluster running (if you don't, add 20 minutes for oci ce cluster create). The deployment manifest:

# deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: oci-api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: oci-api
  template:
    metadata:
      labels:
        app: oci-api
    spec:
      containers:
        - name: api
          image: iad.ocir.io/<tenancy>/demos/oci-api:v1
          ports:
            - containerPort: 8080
          env:
            - name: OCI_REGION
              value: us-ashburn-1
          readinessProbe:
            httpGet:
              path: /health
              port: 8080
            periodSeconds: 5
          resources:
            requests:
              cpu: 100m
              memory: 64Mi
            limits:
              cpu: 500m
              memory: 128Mi
      imagePullSecrets:
        - name: ocir-secret
---
apiVersion: v1
kind: Service
metadata:
  name: oci-api
  annotations:
    oci.oraclecloud.com/load-balancer-type: "lb"
    service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
    service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100"
spec:
  type: LoadBalancer
  selector:
    app: oci-api
  ports:
    - port: 80
      targetPort: 8080

kubectl apply -f deploy.yaml

# Wait for LB IP
kubectl get svc oci-api -w
# NAME      TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)
# oci-api   LoadBalancer   10.96.1.120   129.153.xx.xx    80:31234/TCP

curl http://129.153.xx.xx/
# running on us-ashburn-1

14 minutes. Empty folder to public API on OKE.

What docker init Got Right

I was skeptical about docker init being useful for anything beyond demos. But the generated Dockerfile was genuinely good:

  • Multi-stage build — keeps the final image small
  • Distroless base — minimal attack surface, near-zero CVEs
  • Non-root user — security best practice out of the box
  • Separate dependency downloadgo mod download before COPY . means dependencies are cached and rebuilds are fast

The only things I changed for OKE deployment were the -ldflags optimization and adding a health check endpoint (which docker init can't know about since it's application-specific).

What It Doesn't Do

docker init handles the Docker side. It doesn't generate:

  • Kubernetes manifests
  • CI/CD pipeline config
  • OCIR login/push scripts
  • Terraform for infrastructure

That's fair. It's a Docker tool, not a platform tool. But the Dockerfile it generates is solid enough that I don't need to edit it for most Go and Python projects.

Languages I've Tested

Language Quality of Generated Dockerfile Notes
Go Excellent Multi-stage, static binary, distroless
Python Good Uses slim base, proper requirements.txt handling
Node.js Good Multi-stage, npm ci for production
Rust Excellent cargo-chef for caching, musl for static binary
Java Decent Uses Eclipse Temurin, could use jlink for smaller images

Go and Rust output is good enough to use as-is. Python and Node need minor tweaks depending on your framework. Java needs the most work.

My Workflow Now

For quick services and prototypes, this is my default:

mkdir project && cd project
# write code
docker init
# tweak Dockerfile if needed
docker compose up --build      # test locally
docker push ...                # push to OCIR
kubectl apply -f deploy.yaml   # deploy to OKE

The gap between "it works on my laptop" and "it's running on OKE" is smaller than it's ever been.


Pavan Madduri — Oracle ACE Associate, CNCF Golden Kubestronaut. GitHub | LinkedIn | Website | Google Scholar | ResearchGate