Docker Integration
Docker containerization for Utah applications.
Overview
Docker provides a way to package Utah applications with their dependencies for consistent deployment across environments.
Creating a Dockerfile
A basic Dockerfile for Utah applications:
FROM alpine:latest
# Install bash and other dependencies
RUN apk add --no-cache bash curl git
# Copy Utah scripts
COPY scripts/ /app/scripts/
COPY utah /usr/local/bin/utah
WORKDIR /app
# Run the Utah application
CMD ["utah", "run", "main.shx"]
Docker Compose
For complex applications with multiple services:
version: '3.8'
services:
utah-app:
build: .
volumes:
- ./scripts:/app/scripts
environment:
- ENV=production
database:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_PASSWORD=secret
Best Practices
Security
- Use minimal base images
- Run as non-root user
- Scan for vulnerabilities
Performance
- Use multi-stage builds
- Optimize layer caching
- Minimize image size
CI/CD Integration
- Build images in CI pipeline
- Tag with version numbers
- Push to registry
Examples
Health Check Script
#!/usr/bin/env utah
script.description("Health check for containerized service");
// Check if service is healthy
function healthCheck(): void {
try {
let response: string = web.get("http://localhost:8080/health");
console.log("Service is healthy");
exit(0);
}
catch {
console.log("Service is unhealthy");
exit(1);
}
}
healthCheck();
Deployment Script
#!/usr/bin/env utah
script.description("Deploy application using Docker");
// Deploy application using Docker
function deploy(): void {
console.log("Building Docker image...");
let buildResult: string = `$(docker build -t myapp:latest . 2>&1; echo "EXIT_CODE:$?")`;
let resultParts: string[] = string.split(buildResult, "EXIT_CODE:");
let exitCode: string = "1";
if (array.length(resultParts) > 1) {
exitCode = string.trim(resultParts[1]);
}
if (exitCode != "0") {
console.log("Build failed!");
exit(1);
}
console.log("Deploying container...");
`$(docker run -d --name myapp -p 8080:8080 myapp:latest)`;
console.log("Deployment complete!");
}
deploy();