Skip to content

Commit 0c1972e

Browse files
committed
Refactoring docker-compose for dev environment TFO-GO-SDK
1 parent acc608f commit 0c1972e

File tree

2 files changed

+212
-17
lines changed

2 files changed

+212
-17
lines changed

Dockerfile.dev

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
# =============================================================================
2+
# TelemetryFlow Go SDK - Dockerfile
3+
# =============================================================================
4+
#
5+
# TelemetryFlow Go SDK - Community Enterprise Observability Platform (CEOP)
6+
# Copyright (c) 2024-2026 DevOpsCorner Indonesia. All rights reserved.
7+
#
8+
# Licensed under the Apache License, Version 2.0 (the "License");
9+
# you may not use this file except in compliance with the License.
10+
# You may obtain a copy of the License at
11+
#
12+
# http://www.apache.org/licenses/LICENSE-2.0
13+
#
14+
# Unless required by applicable law or agreed to in writing, software
15+
# distributed under the License is distributed on an "AS IS" BASIS,
16+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17+
# See the License for the specific language governing permissions and
18+
# limitations under the License.
19+
#
20+
# =============================================================================
21+
# Multi-stage build for minimal image size
22+
# =============================================================================
23+
24+
# -----------------------------------------------------------------------------
25+
# Stage 1: Builder
26+
# -----------------------------------------------------------------------------
27+
FROM golang:1.24-alpine AS builder
28+
29+
# Build arguments
30+
ARG VERSION=1.1.1
31+
ARG GIT_COMMIT=unknown
32+
ARG GIT_BRANCH=unknown
33+
ARG BUILD_TIME=unknown
34+
35+
# Install build dependencies
36+
RUN apk add --no-cache git make ca-certificates tzdata
37+
38+
# Set working directory
39+
WORKDIR /build
40+
41+
# Copy go mod files first for better caching
42+
COPY go.mod go.sum ./
43+
44+
# Download dependencies
45+
RUN go mod download && go mod verify
46+
47+
# Copy source code
48+
COPY . .
49+
50+
# Build the generators with version information
51+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
52+
-ldflags "-s -w \
53+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.Version=${VERSION}' \
54+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.GitCommit=${GIT_COMMIT}' \
55+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.GitBranch=${GIT_BRANCH}' \
56+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.BuildTime=${BUILD_TIME}'" \
57+
-o /telemetryflow-gen ./cmd/generator
58+
59+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
60+
-ldflags "-s -w \
61+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.Version=${VERSION}' \
62+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.GitCommit=${GIT_COMMIT}' \
63+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.GitBranch=${GIT_BRANCH}' \
64+
-X 'github.com/telemetryflow/telemetryflow-go-sdk/internal/version.BuildTime=${BUILD_TIME}'" \
65+
-o /telemetryflow-restapi ./cmd/generator-restfulapi
66+
67+
# Verify binaries
68+
RUN /telemetryflow-gen version && /telemetryflow-restapi version
69+
70+
# -----------------------------------------------------------------------------
71+
# Stage 2: Runtime
72+
# -----------------------------------------------------------------------------
73+
FROM alpine:3.21
74+
75+
# =============================================================================
76+
# TelemetryFlow Metadata Labels (OCI Image Spec)
77+
# =============================================================================
78+
LABEL org.opencontainers.image.title="TelemetryFlow Go SDK" \
79+
org.opencontainers.image.description="Go SDK and code generators for TelemetryFlow integration - Community Enterprise Observability Platform (CEOP)" \
80+
org.opencontainers.image.version="1.1.1" \
81+
org.opencontainers.image.vendor="TelemetryFlow" \
82+
org.opencontainers.image.authors="DevOpsCorner Indonesia <support@devopscorner.id>" \
83+
org.opencontainers.image.url="https://telemetryflow.id" \
84+
org.opencontainers.image.documentation="https://docs.telemetryflow.id" \
85+
org.opencontainers.image.source="https://github.com/telemetryflow/telemetryflow-go-sdk" \
86+
org.opencontainers.image.licenses="Apache-2.0" \
87+
org.opencontainers.image.base.name="alpine:3.21" \
88+
# TelemetryFlow specific labels
89+
io.telemetryflow.product="TelemetryFlow Go SDK" \
90+
io.telemetryflow.component="telemetryflow-sdk" \
91+
io.telemetryflow.platform="CEOP" \
92+
io.telemetryflow.maintainer="DevOpsCorner Indonesia"
93+
94+
# Install runtime dependencies
95+
RUN apk add --no-cache \
96+
ca-certificates \
97+
tzdata \
98+
&& rm -rf /var/cache/apk/*
99+
100+
# Create non-root user and group
101+
RUN addgroup -g 10001 -S telemetryflow && \
102+
adduser -u 10001 -S telemetryflow -G telemetryflow -h /home/telemetryflow
103+
104+
# Create workspace directory
105+
RUN mkdir -p /workspace && chown -R telemetryflow:telemetryflow /workspace
106+
107+
# Copy binaries from builder
108+
COPY --from=builder /telemetryflow-gen /usr/local/bin/telemetryflow-gen
109+
COPY --from=builder /telemetryflow-restapi /usr/local/bin/telemetryflow-restapi
110+
RUN chmod +x /usr/local/bin/telemetryflow-gen /usr/local/bin/telemetryflow-restapi
111+
112+
# Switch to non-root user
113+
USER telemetryflow
114+
115+
# Set working directory
116+
WORKDIR /workspace
117+
118+
# =============================================================================
119+
# Entrypoint & Command
120+
# =============================================================================
121+
ENTRYPOINT ["/usr/local/bin/telemetryflow-gen"]
122+
CMD ["--help"]
123+
124+
# =============================================================================
125+
# Build Information
126+
# =============================================================================
127+
# Build with:
128+
# docker build \
129+
# --build-arg VERSION=1.1.1 \
130+
# --build-arg GIT_COMMIT=$(git rev-parse --short HEAD) \
131+
# --build-arg GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) \
132+
# --build-arg BUILD_TIME=$(date -u '+%Y-%m-%dT%H:%M:%SZ') \
133+
# -t telemetryflow/telemetryflow-sdk:1.1.1 .
134+
#
135+
# Run with:
136+
# # SDK Generator
137+
# docker run --rm -v $(pwd):/workspace telemetryflow/telemetryflow-sdk:1.1.1 \
138+
# init --project myapp --service my-service
139+
#
140+
# # RESTful API Generator
141+
# docker run --rm -v $(pwd):/workspace --entrypoint /usr/local/bin/telemetryflow-restapi \
142+
# telemetryflow/telemetryflow-sdk:1.1.1 \
143+
# new --name my-api --module github.com/example/my-api
144+
# =============================================================================

docker-compose.yml

Lines changed: 68 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@
1010
# docker-compose build
1111
#
1212
# # Run SDK generator (init command)
13-
# docker-compose run --rm sdk-gen init --project myapp --service my-service
13+
# docker-compose run --rm sdk-gen init --project myapp --service my-service --output /workspace
1414
#
1515
# # Run RESTful API generator
1616
# docker-compose run --rm sdk-restapi new --name my-api
1717
#
1818
# # Start development environment with observability stack
19-
# docker-compose up -d otel-collector jaeger
19+
# docker-compose --profile dev up -d otel-collector jaeger
20+
#
21+
# # Start full observability stack
22+
# docker-compose --profile full up -d
2023
#
2124
# =============================================================================
2225

@@ -25,8 +28,8 @@ services:
2528
# SDK Generator
2629
# ---------------------------------------------------------------------------
2730
sdk-gen:
28-
container_name: ${CONTAINER_NAME:-telemetryflow-sdk-gen}
29-
image: ${IMAGE_NAME:-telemetryflow/telemetryflow-sdk}:${IMAGE_TAG:-latest}
31+
container_name: ${CONTAINER_NAME:-telemetryflow-go-sdk-gen}
32+
image: ${IMAGE_NAME:-telemetryflow/telemetryflow-go-sdk}:${IMAGE_TAG:-latest}
3033
build:
3134
context: .
3235
dockerfile: Dockerfile
@@ -47,8 +50,8 @@ services:
4750
# RESTful API Generator
4851
# ---------------------------------------------------------------------------
4952
sdk-restapi:
50-
container_name: ${CONTAINER_NAME_RESTAPI:-telemetryflow-sdk-restapi}
51-
image: ${IMAGE_NAME:-telemetryflow/telemetryflow-sdk}:${IMAGE_TAG:-latest}
53+
container_name: ${CONTAINER_NAME_RESTAPI:-telemetryflow-go-sdk-restapi}
54+
image: ${IMAGE_NAME:-telemetryflow/telemetryflow-go-sdk}:${IMAGE_TAG:-latest}
5255
build:
5356
context: .
5457
dockerfile: Dockerfile
@@ -59,11 +62,58 @@ services:
5962
BUILD_TIME: ${BUILD_TIME:-unknown}
6063
entrypoint: ["/usr/local/bin/telemetryflow-restapi"]
6164
command: ["--help"]
65+
environment:
66+
- TELEMETRYFLOW_API_KEY_ID=${TELEMETRYFLOW_API_KEY_ID:-tfk_example}
67+
- TELEMETRYFLOW_API_KEY_SECRET=${TELEMETRYFLOW_API_KEY_SECRET:-tfs_example}
68+
- TELEMETRYFLOW_ENDPOINT=${TELEMETRYFLOW_ENDPOINT:-otel-collector:4317}
69+
- TELEMETRYFLOW_SERVICE_NAME=${TELEMETRYFLOW_SERVICE_NAME:-telemetryflow-go-sdk}
70+
- TELEMETRYFLOW_SERVICE_VERSION=${TELEMETRYFLOW_SERVICE_VERSION:-1.0.0}
71+
- TELEMETRYFLOW_ENVIRONMENT=${TELEMETRYFLOW_ENVIRONMENT:-development}
6272
volumes:
6373
- ./workspace:/workspace
6474
working_dir: /workspace
75+
depends_on:
76+
otel-collector:
77+
condition: service_healthy
78+
networks:
79+
- telemetryflow-sdk
80+
profiles:
81+
- example
82+
83+
# ---------------------------------------------------------------------------
84+
# SDK Development Container
85+
# ---------------------------------------------------------------------------
86+
sdk-dev:
87+
container_name: ${CONTAINER_NAME_RESTAPI:-telemetryflow-go-sdk-dev}
88+
image: ${IMAGE_NAME:-telemetryflow/telemetryflow-go-sdk}:${IMAGE_TAG:-latest}
89+
build:
90+
context: .
91+
dockerfile: Dockerfile.dev
92+
args:
93+
VERSION: ${VERSION:-dev}
94+
GIT_COMMIT: ${GIT_COMMIT:-unknown}
95+
GIT_BRANCH: ${GIT_BRANCH:-main}
96+
BUILD_TIME: ${BUILD_TIME:-unknown}
97+
entrypoint: ["/usr/local/bin/telemetryflow-restapi"]
98+
command: ["--help"]
99+
environment:
100+
- TELEMETRYFLOW_API_KEY_ID=${TELEMETRYFLOW_API_KEY_ID:-tfk_example}
101+
- TELEMETRYFLOW_API_KEY_SECRET=${TELEMETRYFLOW_API_KEY_SECRET:-tfs_example}
102+
- TELEMETRYFLOW_ENDPOINT=${TELEMETRYFLOW_ENDPOINT:-otel-collector:4317}
103+
- TELEMETRYFLOW_SERVICE_NAME=${TELEMETRYFLOW_SERVICE_NAME:-telemetryflow-go-sdk-dev}
104+
- TELEMETRYFLOW_SERVICE_VERSION=${TELEMETRYFLOW_SERVICE_VERSION:-1.0.0}
105+
- TELEMETRYFLOW_ENVIRONMENT=${TELEMETRYFLOW_ENVIRONMENT:-development}
106+
volumes:
107+
- .:/app
108+
- ./workspace:/workspace
109+
working_dir: /app
110+
depends_on:
111+
otel-collector:
112+
condition: service_healthy
65113
networks:
66114
- telemetryflow-sdk
115+
profiles:
116+
- dev
67117

68118
# ---------------------------------------------------------------------------
69119
# OpenTelemetry Collector (for local development)
@@ -73,10 +123,10 @@ services:
73123
image: otel/opentelemetry-collector-contrib:${OTEL_VERSION:-0.142.0}
74124
command: ["--config=/etc/otel/config.yaml"]
75125
ports:
76-
- "${OTLP_GRPC_PORT:-4317}:4317" # OTLP gRPC
77-
- "${OTLP_HTTP_PORT:-4318}:4318" # OTLP HTTP
78-
- "${OTEL_METRICS_PORT:-8888}:8888" # Prometheus metrics
79-
- "${OTEL_HEALTH_PORT:-13133}:13133" # Health check
126+
- "${OTLP_GRPC_PORT:-4317}:4317" # OTLP gRPC
127+
- "${OTLP_HTTP_PORT:-4318}:4318" # OTLP HTTP
128+
- "${OTEL_METRICS_PORT:-8888}:8888" # Prometheus metrics
129+
- "${OTEL_HEALTH_PORT:-13133}:13133" # Health check
80130
volumes:
81131
- ./configs/otel-collector.yaml:/etc/otel/config.yaml:ro
82132
healthcheck:
@@ -89,17 +139,18 @@ services:
89139
profiles:
90140
- dev
91141
- full
142+
- example
92143

93144
# ---------------------------------------------------------------------------
94145
# Jaeger (for trace visualization)
95146
# ---------------------------------------------------------------------------
96147
jaeger:
97148
container_name: jaeger-dev
98-
image: jaegertracing/all-in-one:1.52
149+
image: jaegertracing/all-in-one:${JAEGER_VERSION:-1.64}
99150
ports:
100-
- "${JAEGER_UI_PORT:-16686}:16686" # Jaeger UI
101-
- "${JAEGER_HTTP_PORT:-14268}:14268" # Jaeger HTTP collector
102-
- "${JAEGER_GRPC_PORT:-14250}:14250" # Jaeger gRPC
151+
- "${JAEGER_UI_PORT:-16686}:16686" # Jaeger UI
152+
- "${JAEGER_HTTP_PORT:-14268}:14268" # Jaeger HTTP collector
153+
- "${JAEGER_GRPC_PORT:-14250}:14250" # Jaeger gRPC
103154
environment:
104155
- COLLECTOR_OTLP_ENABLED=true
105156
networks:
@@ -113,7 +164,7 @@ services:
113164
# ---------------------------------------------------------------------------
114165
prometheus:
115166
container_name: prometheus-dev
116-
image: prom/prometheus:v2.48.0
167+
image: prom/prometheus:${PROMETHEUS_VERSION:-v2.54.1}
117168
ports:
118169
- "${PROMETHEUS_PORT:-9090}:9090"
119170
volumes:
@@ -133,7 +184,7 @@ services:
133184
# ---------------------------------------------------------------------------
134185
grafana:
135186
container_name: grafana-dev
136-
image: grafana/grafana:10.2.2
187+
image: grafana/grafana:${GRAFANA_VERSION:-11.4.0}
137188
ports:
138189
- "${GRAFANA_PORT:-3000}:3000"
139190
environment:
@@ -163,4 +214,4 @@ volumes:
163214
networks:
164215
telemetryflow-sdk:
165216
driver: bridge
166-
name: telemetryflow-sdk-network
217+
name: telemetryflow-go-sdk-network

0 commit comments

Comments
 (0)