Skip to content

Commit 92d0b27

Browse files
committed
add test dockerfile
1 parent a42995a commit 92d0b27

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

dockerfile

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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

Comments
 (0)