Skip to content

Instantly share code, notes, and snippets.

@draganHR
Last active June 13, 2024 20:06
Show Gist options
  • Save draganHR/e8b0f38d9c89eb0a5e833a18e9656d31 to your computer and use it in GitHub Desktop.
Save draganHR/e8b0f38d9c89eb0a5e833a18e9656d31 to your computer and use it in GitHub Desktop.
Telepresence inner dev loop
# Compile stage
FROM golang:1.22-alpine AS build-env
ENV GOCACHE=/go-cache \
GOMODCACHE=/gomod-cache
COPY ./go.* ./
RUN --mount=type=cache,target=/gomod-cache \
go mod download
# Add Delve
RUN --mount=type=cache,target=/gomod-cache --mount=type=cache,target=/go-cache \
go install github.com/go-delve/delve/cmd/dlv@latest
ADD . /app
WORKDIR /app
RUN --mount=type=cache,target=/gomod-cache --mount=type=cache,target=/go-cache \
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -gcflags="all=-N -l" cmd/main.go
FROM alpine
# 8080: REST API
# 40000: dlv
EXPOSE 8080 40000
WORKDIR /
COPY --from=build-env /go/bin/dlv /dlv
COPY --from=build-env /app/main /main
CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/main"]

Tested with:

  • telepresence v2.18.0
  • docker-ce-26.1.4-1.fc40.x86_64
  • helm v3.13.3
  • kubectl v1.30.1
  • kubernetes v1.29.4-eks-036c24b
telepresence helm install
telepresence quit -s

telepresence status

# launch telepresence user daemon
telepresence connect --docker --expose 40000:40000 --namespace mynamespace

# list available services
telepresence list

Start intercept and container myapp-image:latest

# optionally tee output to file so IDE can read logs
docker build . -t myapp-image:latest
telepresence intercept --port 8080:8080 myapp --docker-run -- --rm myapp-image:latest | tee -a output.log

Alternatively, run intercept with --docker-build which will build image.

# The `--docker-build` flag implies `--docker-run`.  
# The string "IMAGE", acting as a placeholder for image ID.   
telepresence intercept --port 8080:8080 myapp --docker-build . --docker-build-opt tag=myapp-image:latest -- IMAGE | tee -a output.log

At this point debugger can connect to dlv at localhost:40000.
Port 8080 should be exposed in the cluster.
TODO: port-forward local port to 8080

Verify container environment

# open shell in container
docker ps
docker exec -it <...> sh

env
nslookup kubernetes.default
nslookup otherapp.mynamespace.svc.cluster.local

mount -t fuse.sshfs
cat /var/run/secrets/kubernetes.io/serviceaccount/namespace

exit

Cleanup

# telepresence leave => stop intercept
telepresence leave myapp
# uninstall telepresence agent (removes sidecar)
telepresence uninstall --agent myapp
# telepresence quit => disconnect
telepresence quit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment