当我们完成了前面文章的教程之后,接下来就需要着手准备部署的事情了。
在创建镜像之前,我们先回顾一下 FoodGuider
的项目结构。
foodmanage
和 usermanage
这两个服务都是在 FoodGuider
目录底下、代码管理也都在FoodGuider
目录之下,并且在 FoodGuider
之下创建了go.mod
,之前有读者评论问可不可以分开代码管理,个人觉得是完全可以的。FoodGuider
项目也是跟着官方文档一步一步创建的,因此我也就没有去改动项目结构了。
这样也就导致接下来我要创建的 Dockerfile
文件都在 FoodGuider
。
创建Dockerfile
goctl
工具为我们提供了简便的创建镜像的方法
cd
到 FoodGuider
目录下,执行命令创建 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
文件是错的,注意修改为上述的配置。
因为我们这个项目主要是演示,因此项目还是在本地跑,默认的 GOOS
是 linux
,修改为 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
的镜像。
同样的操作 创建 UserRPCDockerfile
、FoodAPIDockerfile
、FoodRPCDockerfile
,并生成对应镜像,这里就不赘述。 注意 GOOS
和 RUN
配置的修改。
查看本地镜像
➜ 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
文件 放到对应的服务里面。