1+ # 第一阶段:依赖下载
2+ FROM golang:1.21 AS deps
3+
4+ WORKDIR /app
5+
6+ # 添加一些模拟的go.mod和go.sum文件
7+ RUN echo 'module github.com/openimsdk/test-project' > go.mod && \
8+ echo 'go 1.21' >> go.mod && \
9+ echo 'require (' >> go.mod && \
10+ echo ' github.com/gin-gonic/gin v1.9.1' >> go.mod && \
11+ echo ' github.com/go-redis/redis/v8 v8.11.5' >> go.mod && \
12+ echo ' github.com/spf13/viper v1.16.0' >> go.mod && \
13+ echo ' go.mongodb.org/mongo-driver v1.12.1' >> go.mod && \
14+ echo ' google.golang.org/grpc v1.58.2' >> go.mod && \
15+ echo ' google.golang.org/protobuf v1.31.0' >> go.mod && \
16+ echo ')' >> go.mod
17+
18+ # 安装一些额外的工具和依赖,这会花费一些时间
19+ RUN apt-get update && \
20+ apt-get install -y git curl build-essential protobuf-compiler && \
21+ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 && \
22+ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 && \
23+ go install github.com/golang/mock/mockgen@v1.6.0 && \
24+ go install github.com/swaggo/swag/cmd/swag@latest
25+
26+ # 下载依赖,这会消耗一定时间
27+ RUN go mod download
28+
29+ # 添加一个故意延时的操作,确保构建不会太快
30+ RUN sleep 15
31+
32+ # 第二阶段:代码编译
33+ FROM deps AS builder
34+
35+ WORKDIR /app
36+
37+ # 创建一些基本的源文件结构
38+ RUN mkdir -p cmd/server api/proto internal/pkg config
39+
40+ # 创建一个简单的main.go文件
41+ RUN echo 'package main\n\nimport (\n "fmt"\n "net/http"\n "time"\n)\n\nfunc main() {\n fmt.Println("Starting server...")\n http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n time.Sleep(100 * time.Millisecond)\n fmt.Fprintf(w, "Hello from OpenIM Server!")\n })\n http.ListenAndServe(":8080", nil)\n}' > cmd/server/main.go
42+
43+ # 模拟生成一些protobuf文件
44+ RUN echo 'syntax = "proto3";\npackage api;\noption go_package = "github.com/openimsdk/test-project/api/gen";\n\nservice UserService {\n rpc GetUser(GetUserRequest) returns (GetUserResponse);\n}\n\nmessage GetUserRequest {\n string user_id = 1;\n}\n\nmessage GetUserResponse {\n string user_id = 1;\n string username = 2;\n}' > api/proto/user.proto
45+
46+ # 模拟编译protobuf文件
47+ RUN mkdir -p api/gen && \
48+ echo 'package gen\n\ntype UserServiceServer interface {\n GetUser(req *GetUserRequest) (*GetUserResponse, error)\n}\n\ntype GetUserRequest struct {\n UserId string\n}\n\ntype GetUserResponse struct {\n UserId string\n Username string\n}' > api/gen/user.pb.go
49+
50+ # 编译项目,添加一些额外的编译参数以增加编译时间
51+ RUN go build -ldflags="-s -w" -o bin/server ./cmd/server/
52+
53+ # 模拟运行测试
54+ RUN echo 'package main\n\nimport "testing"\n\nfunc TestMain(t *testing.T) {\n // Just a placeholder test\n}' > cmd/server/main_test.go && \
55+ cd cmd/server && go test -v
56+
57+ # 故意添加延时以模拟长时间构建
58+ RUN sleep 20
59+
60+ # 第三阶段:最终镜像
61+ FROM alpine:latest
62+
63+ WORKDIR /app
64+
65+ # 安装一些运行时依赖
66+ RUN apk add --no-cache ca-certificates tzdata libc6-compat && \
67+ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
68+ echo "Asia/Shanghai" > /etc/timezone
69+
70+ # 模拟一些配置文件
71+ RUN mkdir -p /app/config && \
72+ echo '{"server":{"port":8080},"database":{"host":"localhost","port":5432}}' > /app/config/config.json
73+
74+ # 从构建阶段复制编译好的应用
75+ COPY --from=builder /app/bin/server /app/server
76+
77+ # 添加健康检查命令
78+ COPY --from=builder /app/bin/server /usr/local/bin/server
79+ RUN echo '#!/bin/sh\necho "Health check passed!"\nexit 0' > /usr/local/bin/mage && \
80+ chmod +x /usr/local/bin/mage
81+
82+ # 模拟更多文件复制
83+ RUN mkdir -p /app/static && \
84+ echo '<html><body><h1>OpenIM Server</h1></body></html>' > /app/static/index.html
85+
86+ # 再次故意延时
87+ RUN sleep 10
88+
89+ # 设置环境变量
90+ ENV APP_ENV=production \
91+ LOG_LEVEL=info \
92+ SERVER_PORT=8080
93+
94+ # 暴露端口
95+ EXPOSE 8080
96+
97+ # 启动应用
98+ CMD ["/app/server"]
0 commit comments