Skip to content

Commit 48bfa66

Browse files
committed
feat: Create a dockerfile for cachew
1 parent ecf5911 commit 48bfa66

2 files changed

Lines changed: 170 additions & 0 deletions

File tree

Dockerfile

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
ARG ALPINE_VERSION=3.21
2+
FROM alpine:${ALPINE_VERSION}
3+
4+
ARG TARGETARCH
5+
ARG TARGETPLATFORM
6+
7+
SHELL ["/bin/sh", "-o", "pipefail", "-c"]
8+
9+
# Install runtime dependencies for git operations and TLS
10+
RUN apk add --no-cache ca-certificates git
11+
12+
# Set working directory (config uses relative paths like ./state/cache)
13+
WORKDIR /app
14+
15+
# Copy pre-built binary for the target architecture
16+
COPY dist/cachewd-linux-${TARGETARCH} /usr/local/bin/cachewd
17+
18+
# Copy default configuration file
19+
COPY cachew.hcl /app/cachew.hcl
20+
21+
# Bind to all interfaces in Docker (can be overridden with CACHEW_BIND env var)
22+
ENV CACHEW_BIND=0.0.0.0:8080
23+
24+
ENTRYPOINT ["/usr/local/bin/cachewd"]
25+
CMD ["--config", "/app/cachew.hcl"]

Justfile

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
set positional-arguments := true
22
set shell := ["bash", "-c"]
33

4+
# Configuration
5+
6+
VERSION := `git describe --tags --always --dirty 2>/dev/null || echo "dev"`
7+
GIT_COMMIT := `git rev-parse HEAD 2>/dev/null || echo "unknown"`
8+
TAG := `git rev-parse --short HEAD 2>/dev/null || echo "dev"`
9+
RELEASE := "dist"
10+
REGISTRY := env_var_or_default("REGISTRY", "268271485387.dkr.ecr.us-west-2.amazonaws.com")
11+
IMAGE_NAME := "cachew"
12+
IMAGE_REF := REGISTRY + "/" + IMAGE_NAME + ":" + TAG
13+
IMAGE_LATEST := REGISTRY + "/" + IMAGE_NAME + ":latest"
14+
415
_help:
516
@just -l
617

@@ -18,3 +29,137 @@ fmt:
1829
just --unstable --fmt
1930
golangci-lint fmt
2031
go mod tidy
32+
33+
# ============================================================================
34+
# Build
35+
# ============================================================================
36+
37+
# Build for current platform
38+
build:
39+
@mkdir -p {{ RELEASE }}
40+
@go build -trimpath -o {{ RELEASE }}/cachewd \
41+
-ldflags "-s -w -X main.version={{ VERSION }} -X main.gitCommit={{ GIT_COMMIT }}" \
42+
./cmd/cachewd
43+
@echo "✓ Built {{ RELEASE }}/cachewd"
44+
45+
# Build for Linux (current arch)
46+
build-linux:
47+
#!/usr/bin/env bash
48+
set -e
49+
mkdir -p {{ RELEASE }}
50+
ARCH=$(uname -m)
51+
[[ "$ARCH" == "x86_64" ]] && ARCH="amd64"
52+
[[ "$ARCH" == "aarch64" || "$ARCH" == "arm64" ]] && ARCH="arm64"
53+
echo "Building for linux/${ARCH}..."
54+
GOOS=linux GOARCH=${ARCH} go build -trimpath \
55+
-o {{ RELEASE }}/cachewd-linux-${ARCH} \
56+
-ldflags "-s -w -X main.version={{ VERSION }} -X main.gitCommit={{ GIT_COMMIT }}" \
57+
./cmd/cachewd
58+
echo "✓ Built {{ RELEASE }}/cachewd-linux-${ARCH}"
59+
60+
# Build all platforms
61+
build-all:
62+
@mkdir -p {{ RELEASE }}
63+
@echo "Building all platforms..."
64+
@GOOS=darwin GOARCH=arm64 go build -trimpath -o {{ RELEASE }}/cachewd-darwin-arm64 -ldflags "-s -w -X main.version={{ VERSION }} -X main.gitCommit={{ GIT_COMMIT }}" ./cmd/cachewd
65+
@GOOS=darwin GOARCH=amd64 go build -trimpath -o {{ RELEASE }}/cachewd-darwin-amd64 -ldflags "-s -w -X main.version={{ VERSION }} -X main.gitCommit={{ GIT_COMMIT }}" ./cmd/cachewd
66+
@GOOS=linux GOARCH=arm64 go build -trimpath -o {{ RELEASE }}/cachewd-linux-arm64 -ldflags "-s -w -X main.version={{ VERSION }} -X main.gitCommit={{ GIT_COMMIT }}" ./cmd/cachewd
67+
@GOOS=linux GOARCH=amd64 go build -trimpath -o {{ RELEASE }}/cachewd-linux-amd64 -ldflags "-s -w -X main.version={{ VERSION }} -X main.gitCommit={{ GIT_COMMIT }}" ./cmd/cachewd
68+
@echo "✓ Built all platforms"
69+
70+
# ============================================================================
71+
# Docker
72+
# ============================================================================
73+
74+
# Build single-arch Docker image
75+
docker-build: build-linux
76+
#!/usr/bin/env bash
77+
set -e
78+
ARCH=$(uname -m)
79+
[[ "$ARCH" == "x86_64" ]] && ARCH="amd64"
80+
[[ "$ARCH" == "aarch64" || "$ARCH" == "arm64" ]] && ARCH="arm64"
81+
echo "Building Docker image for linux/${ARCH}..."
82+
docker build --platform linux/${ARCH} -t {{ IMAGE_NAME }}:local .
83+
echo "✓ Built {{ IMAGE_NAME }}:local"
84+
85+
# Build multi-arch Docker image
86+
docker-build-multi: build-all
87+
#!/usr/bin/env bash
88+
set -e
89+
BUILDER="multi-arch-{{ IMAGE_NAME }}"
90+
docker buildx create --driver docker-container --driver-opt image=moby/buildkit:v0.17.3 --name "$BUILDER" 2>/dev/null || true
91+
docker buildx use "$BUILDER"
92+
echo "Building multi-arch image..."
93+
docker buildx build --platform linux/amd64,linux/arm64 \
94+
-t {{ IMAGE_REF }} -t {{ IMAGE_LATEST }} .
95+
echo "✓ Built multi-arch image"
96+
97+
# ============================================================================
98+
# Run
99+
# ============================================================================
100+
101+
# Run natively
102+
run: build
103+
@echo "→ Starting cachew at http://localhost:8080"
104+
@mkdir -p state
105+
@{{ RELEASE }}/cachewd --config cachew.hcl
106+
107+
# Run in Docker (optionally with debug: just docker-run debug)
108+
docker-run log_level="info": docker-build
109+
@echo "→ Starting cachew at http://localhost:8080 (log-level={{ log_level }})"
110+
@docker run --rm -it -p 8080:8080 -v $(pwd)/state:/app/state --name {{ IMAGE_NAME }} {{ IMAGE_NAME }}:local --log-level={{ log_level }}
111+
112+
# Clean up build artifacts and Docker images
113+
docker-clean:
114+
@echo "Cleaning..."
115+
@rm -rf {{ RELEASE }}
116+
@docker rmi {{ IMAGE_NAME }}:local 2>/dev/null || true
117+
@docker rmi {{ IMAGE_REF }} 2>/dev/null || true
118+
@docker rmi {{ IMAGE_LATEST }} 2>/dev/null || true
119+
@echo "✓ Cleaned"
120+
121+
# ============================================================================
122+
# ECR Push
123+
# ============================================================================
124+
125+
# Push to ECR
126+
image-push tag="latest": build-all
127+
#!/usr/bin/env bash
128+
set -e
129+
130+
# Login to ECR
131+
echo "→ Authenticating to ECR..."
132+
aws-creds sync
133+
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
134+
ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.us-west-2.amazonaws.com"
135+
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin $ECR_REGISTRY
136+
aws ecr create-repository --repository-name {{ IMAGE_NAME }} --region us-west-2 2>/dev/null || true
137+
138+
# Build and push
139+
BUILDER="multi-arch-{{ IMAGE_NAME }}"
140+
docker buildx rm "$BUILDER" 2>/dev/null || true
141+
docker buildx create --driver docker-container --driver-opt image=moby/buildkit:v0.17.3 --name "$BUILDER"
142+
docker buildx use "$BUILDER"
143+
144+
TAGS="-t {{ IMAGE_REF }}"
145+
[[ "{{ tag }}" == "latest" ]] && TAGS="$TAGS -t {{ IMAGE_LATEST }}"
146+
147+
echo "→ Pushing multi-arch image..."
148+
docker buildx build --platform linux/amd64,linux/arm64 $TAGS --push .
149+
echo "✓ Pushed to ECR"
150+
151+
# Push to ECR (CI - no login)
152+
image-push-ci tag="latest": build-all
153+
#!/usr/bin/env bash
154+
set -e
155+
BUILDER="multi-arch-{{ IMAGE_NAME }}"
156+
docker buildx rm "$BUILDER" 2>/dev/null || true
157+
docker buildx create --driver docker-container --driver-opt image=moby/buildkit:v0.17.3 --name "$BUILDER"
158+
docker buildx use "$BUILDER"
159+
160+
TAGS="-t {{ IMAGE_REF }}"
161+
[[ "{{ tag }}" == "latest" ]] && TAGS="$TAGS -t {{ IMAGE_LATEST }}"
162+
163+
echo "→ Pushing multi-arch image..."
164+
docker buildx build --platform linux/amd64,linux/arm64 $TAGS --push .
165+
echo "✓ Pushed to ECR"

0 commit comments

Comments
 (0)