COBOL on Miren
If it compiles to a program that can write bytes to a socket, Miren can run it — COBOL
included. COBOL has no built-in HTTP server, so this guide compiles a COBOL program with
GnuCOBOL that prints a complete HTTP response, and
puts socat in front of it to handle the socket.
Ask your AI coding agent to "set up this COBOL program on Miren" after installing the
Miren agent skills. It adds the Dockerfile.miren and the socket
front-end, and deploys — using this page as its reference.
Do you need a Dockerfile?
Yes. Add a Dockerfile.miren to your project root. Miren builds from it instead of
guessing the stack — see Using Dockerfile.miren.
Miren auto-detects and builds common stacks (Python, Node, Bun, Go, Ruby, Rust) without a Dockerfile. This language isn't one of them yet — if you'd like first-class support, request it.
The program
The COBOL program writes a full HTTP response — status line, headers, a blank line, then
the body — to standard output. X"0D0A" is CRLF:
IDENTIFICATION DIVISION.
PROGRAM-ID. hello.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CRLF PIC X(2) VALUE X"0D0A".
PROCEDURE DIVISION.
DISPLAY
"HTTP/1.1 200 OK" CRLF
"Content-Type: text/plain" CRLF
"Connection: close" CRLF
CRLF
"Hello from COBOL on Miren!" CRLF
WITH NO ADVANCING
STOP RUN.
The socket front-end
The program itself doesn't listen on a port — socat does. For each connection, socat
runs the program and pipes its stdout back to the client. Miren injects PORT, and
socat's TCP-LISTEN binds all interfaces:
web: socat TCP-LISTEN:$PORT,reuseaddr,fork EXEC:/app/hello
This socat pattern works for any language that can print an HTTP response to stdout.
Miren's HTTP ingress terminates TLS and handles the public HTTP layer in front of your
app, so socat only needs to hand each accepted connection to your program — it isn't
exposed to raw internet traffic. The one practical limit is that fork spawns a process
per request, so this suits low-traffic endpoints and tooling rather than high-throughput
services.
The Dockerfile
Create Dockerfile.miren in your project root. It installs GnuCOBOL and socat, then
compiles the program:
FROM debian:12-slim
RUN apt-get update -y \
&& apt-get install -y gnucobol socat \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY hello.cob .
RUN cobc -x -o /app/hello hello.cob
EXPOSE 8080
.dockerignore
.git
Deploy
Create .miren/app.toml naming your app and deploy from your project root:
name = "cobol-bench"
miren deploy
Even with a Dockerfile.miren, Miren needs at least one service defined — the web:
line above. Without it the deploy stops with no services defined.
Agent quick reference
- Detection: none — requires
Dockerfile.miren - Build:
cobc -x -o /app/hello hello.cobondebian:12-slimwithgnucobol - Serving: the program prints a full HTTP response;
socathandles the socket - Service is required:
Procfileweb: socat TCP-LISTEN:$PORT,reuseaddr,fork EXEC:/app/hello - Port:
socat TCP-LISTEN:$PORTbinds0.0.0.0 - Pattern: the same
socatfront-end works for any language that writes an HTTP response to stdout
Next steps
- Using Dockerfile.miren — how custom builds work
- App Configuration — customize
.miren/app.toml - Deployment — how deploys build and activate