• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go项目创建Dockerfile,构建docker镜像

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

两种方式创建Dockerfile :

一、手动创建编写Dockerfile

1. Dockerfile一些额外注意点
选择最简单的镜像

比如alpine,整个镜像5M左右

设置镜像时区

RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai

 

或者scratch,最小

设置镜像时区

ENV TZ Asia/Shanghai

 


2. 多阶段构建
第一阶段,负责构建出可执行文件,确保构建过程独立于宿主机
第二阶段,将第一阶段的输出作为输入,构建出最终的极简镜像


3.编写Dockerfile

FROM golang:1.15.0-alpine3.12 as builder
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY=https://goproxy.cn,direct
# 移动到工作目录:/opt/gat1400-Go/api-server 这个目录 是项目代码 放在linux上
# 这是我的代码跟目录
WORKDIR /opt/gat1400-Go/api-server
COPY . .
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o linux_api_server .

FROM alpine as final

# 时区设置成当前时区
RUN apk add --no-cache tzdata
ENV TZ="Asia/Shanghai"
# 移动到用于存放生成的二进制文件的 /opt/app 目录
WORKDIR /opt/app
# 将二进制文件从 /opt/gat1400-Go/api-server 目录复制到这里
COPY --from=builder /opt/gat1400-Go/api-server/linux_api_server .
# 在容器目录 /opt/app 创建一个目录 为config
#RUN mkdir config .
#COPY --from=builder  /opt/gat1400-Go/api-server/config/app.json ./config/

# 指定运行时环境变量
ENV GIN_MODE=release \
    PORT=8090

# 声明服务端口
EXPOSE 8090
CMD ["/opt/app/linux_api_server"]

如果想构建的镜像更小,可以使用如下写法,使用scratch,

FROM golang:1.15.0-alpine3.12 as builder
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY=https://goproxy.cn,direct
# 移动到工作目录:/opt/gat1400-Go/api-server 这个目录 是项目代码 放在linux上
# 这是我的代码跟目录
WORKDIR /opt/gat1400-Go/api-server
COPY . .
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o linux_api_server .

FROM scratch as final

# 时区设置成当前时区
#RUN apk add --no-cache tzdata
ENV TZ="Asia/Shanghai"
# 移动到用于存放生成的二进制文件的 /opt/app 目录
WORKDIR /opt/app
# 将二进制文件从 /opt/gat1400-Go/api-server 目录复制到这里
COPY --from=builder /opt/gat1400-Go/api-server/linux_api_server .
# 在容器目录 /opt/app 创建一个目录 为config
#RUN mkdir config .
#COPY --from=builder  /opt/gat1400-Go/api-server/config/app.json ./config/

# 指定运行时环境变量
ENV GIN_MODE=release \
    PORT=8090

# 声明服务端口
EXPOSE 8090
CMD ["/opt/app/linux_api_server"]

二、一键生成Dockerfile(使用插件)

1.首先安装 goctl 工具

go get -u github.com/tal-tech/go-zero/tools/goctl

2.在项目根目录下,执行指令,一键生成Dockerfile

 goctl docker -go main.go       

生成如下Dockerfile:

FROM golang:alpine AS builder

LABEL stage=gobuilder

ENV CGO_ENABLED 0
ENV GOOS linux
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/main ./main.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/main /app/main

CMD ["./main"]

3.根据当前项目修改Dockerfile

注:1.指定golang:alpine版本,防止引用包版本不一致构建中报错

  2.删除apk update --no-cache &&与 ca-certificates,加快构建速度

  3.添加EXPOSE 暴露端口,以便外部与容器通信,例如:EXPOSE 8090

FROM golang:1.15.0-alpine3.12 AS builder

LABEL stage=gobuilder

ENV CGO_ENABLED 0
ENV GOOS linux
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/main ./main.go


FROM alpine

#RUN  apk add --no-cache tzdata
ENV TZ Asia/Shanghai

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


# 声明服务端口
EXPOSE 8090
CMD ["./main"]

如果想构建的镜像更小,可以使用如下写法,使用scratch,

FROM golang:1.15.0-alpine3.12 AS builder

LABEL stage=gobuilder

ENV CGO_ENABLED 0
ENV GOOS linux
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/main ./main.go


FROM scratch

#RUN  apk add --no-cache tzdata
ENV TZ Asia/Shanghai

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


# 声明服务端口
EXPOSE 8090
CMD ["./main"]

三、执行Dockerfile,并生成docker镜像

在当前目录下,执行

docker build -t api-server:v10 .

四、添加启动用户

为了避免使用container中的默认用户root启动container,(那可是有安全漏洞的)

 建议在Dockerfile中创建用户并使用该用户启动

创建一个app-runner的用户, -D表示无密码。

RUN adduser -u 10001 -D app-runner

 

此用户的信息是是需要拷到final中,作为应用程序的启动用户

USER app-runner

完整Dockerfile如下:

FROM golang:1.15.0-alpine3.12 as builder
# 创建一个app-runner的用户, -D表示无密码
RUN adduser -u 10001 -D app-runner
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY=https://goproxy.cn,direct
# 移动到工作目录:/opt/gat1400-Go/api-server 这个目录 是项目代码 放在linux上
# 这是我的代码跟目录
WORKDIR /opt/gat1400-Go/api-server
COPY . .
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o linux_api_server .

FROM alpine as final

# 时区设置成当前时区
RUN apk add --no-cache tzdata
ENV TZ="Asia/Shanghai"
# 移动到用于存放生成的二进制文件的 /opt/app 目录
WORKDIR /opt/app
# 将二进制文件从 /opt/gat1400-Go/api-server 目录复制到这里
COPY --from=builder /opt/gat1400-Go/api-server/linux_api_server .
# 在容器目录 /opt/app 创建一个目录 为config
#RUN mkdir config .
#COPY --from=builder  /opt/gat1400-Go/api-server/config/app.json ./config/

# 指定运行时环境变量
ENV GIN_MODE=release \
    PORT=8090

# 声明服务端口
EXPOSE 8090

# 使用app-runner启动容器
USER app-runner

CMD ["/opt/app/linux_api_server"]

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
解决Error: failed to normalize chaincode path: ‘go list‘ failed with: goChainc ...发布时间:2022-07-10
下一篇:
Go语言 - goroutine发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap