go-zero教程—— FoodGuides项目镜像创建

当我们完成了前面文章的教程之后,接下来就需要着手准备部署的事情了。

在创建镜像之前,我们先回顾一下 FoodGuider 的项目结构。

foodmanageusermanage 这两个服务都是在 FoodGuider 目录底下、代码管理也都在FoodGuider 目录之下,并且在 FoodGuider 之下创建了go.mod ,之前有读者评论问可不可以分开代码管理,个人觉得是完全可以的。FoodGuider 项目也是跟着官方文档一步一步创建的,因此我也就没有去改动项目结构了。

这样也就导致接下来我要创建的 Dockerfile 文件都在 FoodGuider

创建Dockerfile

goctl 工具为我们提供了简便的创建镜像的方法

cdFoodGuider 目录下,执行命令创建 Dockerfile 文件

➜  FoodGuides git:(master) ✗ goctl docker -go usermanage/api/user.go
Done.
复制代码

查看 FoodGuider 下的 Dockerfile 文件,重命名为 UserAPIDockerfile

FROM golang:alpine AS builder

LABEL stage=gobuilder

ENV CGO_ENABLED 0
ENV GOOS darwin
ENV GOPROXY https://goproxy.cn,direct

WORKDIR /build/zero

ADD go.mod .
ADD go.sum .
RUN go mod download
COPY . .
RUN go build -ldflags="-s -w" -o /app/user usermanage/rpc/user/user.go


FROM alpine

RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata
ENV TZ Asia/Shanghai

WORKDIR /app
COPY --from=builder /app/user /app/user

CMD ["./user"]
复制代码

此时的 UserAPIDockerfile 文件还不能直接用,

RUN go build -ldflags="-s -w" -o /app/user usermanage/rpc/user/user.go
复制代码

上面的配置在goctl 直接生成的 Dockerfile 文件是错的,注意修改为上述的配置。

因为我们这个项目主要是演示,因此项目还是在本地跑,默认的 GOOSlinux ,修改为 darwin

除了上述修改基本可以不用改动任务配置就可以直接用。当然也是支持自己手动配置 Dockerfile 的。

创建镜像

➜  FoodGuides git:(master) ✗ docker build -t userapi:1.0.0 -f UserAPIDockerfile .
[+] Building 89.7s (17/17) FINISHED
 => [internal] load build definition from UserAPIDockerfile                                                                        0.0s
 => => transferring dockerfile: 497B                                                                                               0.0s
 => [internal] load .dockerignore                                                                                                  0.0s
 => => transferring context: 2B                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                  15.5s
 => [internal] load metadata for docker.io/library/golang:alpine                                                                   0.0s
 => [internal] load build context                                                                                                  0.1s
 => => transferring context: 25.88kB                                                                                               0.1s
 => [stage-1 1/4] FROM docker.io/library/alpine@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300            0.0s
 => [builder 1/7] FROM docker.io/library/golang:alpine                                                                             0.0s
 => CACHED [builder 2/7] WORKDIR /build/zero                                                                                       0.0s
 => CACHED [builder 3/7] ADD go.mod .                                                                                              0.0s
 => CACHED [builder 4/7] ADD go.sum .                                                                                              0.0s
 => CACHED [builder 5/7] RUN go mod download                                                                                       0.0s
 => CACHED [builder 6/7] COPY . .                                                                                                  0.0s
 => [builder 7/7] RUN go build -ldflags="-s -w" -o /app/user usermanage/api/user.go                                               73.5s
 => CACHED [stage-1 2/4] RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata                                    0.0s
 => CACHED [stage-1 3/4] WORKDIR /app                                                                                              0.0s
 => [stage-1 4/4] COPY --from=builder /app/user /app/user                                                                          0.1s
 => exporting to image                                                                                                             0.2s
 => => exporting layers                                                                                                            0.2s
 => => writing image sha256:5483a8424938b79207c44731d5243e2d0ef34eb27c235fe3c5c93eaf72415f26                                       0.0s
 => => naming to docker.io/library/userapi:1.0.0
复制代码

不出意外的话,本地就生成了 userapi:1.0.0 的镜像。

同样的操作 创建 UserRPCDockerfileFoodAPIDockerfileFoodRPCDockerfile,并生成对应镜像,这里就不赘述。 注意 GOOSRUN 配置的修改。

查看本地镜像

➜  FoodGuides git:(master) ✗ docker images
REPOSITORY     TAG       IMAGE ID       CREATED             SIZE
userapi        1.0.0     5483a8424938   11 minutes ago      23.9MB
userrpc        1.0.0     13a827665ac5   14 minutes ago      25.9MB
foodrpc        1.0.0     7065e8b5edaa   About an hour ago   25.9MB
foodapi        1.0.0     5c25ff6de6f9   About an hour ago   23.9MB
bitnami/etcd   latest    f075af140386   6 months ago        132MB
nginx          latest    d1a364dc548d   7 months ago        133MB
traefik        2.4       deaf4b1027ed   8 months ago        91.3MB
mysql          8.0.23    cbe8815cbea8   9 months ago        546MB
redis          6.2-rc2   dc4395f73f8d   11 months ago       105MB
golang         alpine    1463476d8605   12 months ago       299MB
➜  FoodGuides git:(master) ✗
复制代码

这样 FoodGuider 项目的镜像就创建完了。

这里留一个小问题给大家,如何把UserAPIDockerfile 这四个看着别扭的 Dockerfile 文件 放到对应的服务里面。

上一篇《go-zero教程——Food rpc - DeleteFood》

猜你喜欢

转载自juejin.im/post/7049732161410187277